29 August 2016

最近swoole服务总是不稳定,平均没过48小时就会停止响应,表现为进程并没有终止,但服务器端就是不能响应,我设想了一些可能的原因:

  • 程序存在内存泄漏
  • worker进程或者taskWorker进程队列堆积
  • 程序执行时遇到致命错误
  • 系统设置存在问题

通过对进程和内存的仔细观察,基本排除了内存泄漏的可能。目前swoole服务每天处理100多万个请求,260万的taskWorker,我感觉这个量算不上特别大,也修改过worker进程或taskWorker进程数量,问题依旧,所以我觉得也不是第二个原因造成的。

目前,我使用公司的mes系统对服务进行实时监控,主要是监测某一项任务中执行时间大于等于5秒的任务占全部任务的比例,正常值应在0.5%以下,超过这个数值会给我发短信报警,目前只能通过重启服务来解决

今天依据swoole官网的文档,对服务器的系统参数进行了调优,准备观察一下看看,如果问题不再出现就说明是参数设置的问题,另外我还会想一些办法对异常错误进行捕获,如果还出问题,就再找原因呗 ╮(╯▽╰)╭

以下是一些常用命令及系统调优方法

1.查看内存占用的命令

    ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep swoole |  sort -nrk5

    watch -n 1 'ps aux --sort -pmem, -pcpu |grep swoole| head 20'

    free -m

    lsof | grep swoole
    

2.修改ulimit

(a)
    ulimit -n 262140
    

说明:Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量)。

查看:

    ulimit -n
    
(b)
    ulimit -c unlimited
    

说明:可以产生coredump且不受大小限制

查看:

    ulimit -c
    

查看全部配置

    ulimit -a
    
(c)

设置 /etc/security/limits.conf

加入:

    * soft nofile 262140
    * hard nofile 262140
    root soft nofile 262140
    root hard nofile 262140

    * soft core unlimited
    * hard core unlimited
    root soft core unlimited
    root hard core unlimited
    

3.修改 /etc/sysctl.conf

加入:

    net.unix.max_dgram_qlen = 100
    net.core.wmem_default = 8388608
    net.core.rmem_default = 8388608
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    kernel.core_pattern = /mfw_project/run_data/core_files/core-%e-%p-%t
    net.ipv4.tcp_max_syn_backlog=81920
    net.ipv4.tcp_synack_retries=3
    

说明:

  • max_dgram_qlen : 最大数据报个数

    swoole使用unix socket dgram来做进程间通信,如果请求量很大,需要调整此参数。系统默认为10,可以设置为100或者更大。或者增加worker进程的数量,减少单个worker进程分配的请求量。

  • wmem_max : 最大的TCP数据发送缓冲
  • rmen_max : 最大的TCP数据接收缓冲
  • kernel.core_pattern : 开启CoreDump,一旦程序发生异常,会将进程导出到文件。对于调查程序问题有很大的帮助, 必须先确认 ulimit -c 不为零

使生效:

    sysctl -p
    

查看:

    sysctl -a | grep max_dgram_qlen
    

结束语:最近发现自己表面上好像对swoole用的挺熟,其实只是知道了一些皮毛而已,实在不足挂齿。