zoukankan      html  css  js  c++  java
  • uwsgi 报MemoryError

    网站部署后,基本一天有时候几个小时就会502,查看uwsgi日志看到,一直在报MemoryError的错

    之前以为是python版本的问题,说是32位的python最多支持2G,但查看了python版本,是64位的啊

    >>> import platform
    >>> platform.architecture()
    ('64bit', 'ELF')
    >>>
    于是怀疑程序问题,内存占用到了物理内存的极限,所以加了2G虚拟内存

    [root@iZbp1cixaslir6lcn0qcdvZ ~]# free -m
    total used free shared buffers cached
    Mem: 16081 5502 10578 0 208 3702
    -/+ buffers/cache: 1591 14489
    Swap: 2047 0 2047
    甚至发现,系统内存使用量还不到1/3

    最后查看了下uwsgi的配置文件的文档

    socket : 地址和端口号,例如:socket = 127.0.0.1:50000

    processes : 开启的进程数量

    workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number of workers / processes)

    chdir : 指定运行目录(chdir to specified directory before apps loading)

    wsgi-file : 载入wsgi-file(load .wsgi file)

    stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)

    threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)

    master : 允许主进程存在(enable master process)

    daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

    log-maxsize :以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize = 50000000 就是50M一个日志文件。

    pidfile : 指定pid文件的位置,记录主进程的pid号。

    vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

    disable-logging : 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。如果不开启这项,那么你的日志中会大量出现这种记录:

    [pid: 347|app: 0|req: 106/367] 117.116.122.172 () {52 vars in 961 bytes} [Thu Jul 7 19:20:56 2016] POST /post => generated 65 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)

    log-maxsize: 日志大小,当大于这个大小会进行切分 (Byte)

    log-truncate: 当启动时切分日志
    发现有这两个参数

    limit-as 和 roload-on-as

    原来limit-as是512,也就是每个进程最大虚拟内存只有512,故试着把这个参数调大到2048,并加一个reload-on-as = 1024,在达到1024的时候重启进程双保险

    于是修改配置文件如下

    socket = 127.0.0.1:8888
    master = true
    vhost = true
    no-site = true
    workers = 2
    reload-mercy = 10
    vacuum = true
    max-requests = 1000
    limit-as = 2048
    reload-on-as = 1024
    buffer-size = 30000
    pidfile = /var/run/uwsgi8888.pid
    daemonize = /website/uwsgi8888.log
    结果按照这个配置,果然不再出现MemoryError的问题了

  • 相关阅读:
    数据窗口的缓冲区
    RowsMove()
    update
    defparameter defconstant
    1+ 1
    原则
    incf decf
    eql equal
    上司找谈话
    判断回文的函数palindrome?
  • 原文地址:https://www.cnblogs.com/ExMan/p/10560408.html
Copyright © 2011-2022 走看看