最近swoole服务总是不稳定,平均没过48小时就会停止响应,表现为进程并没有终止,但服务器端就是不能响应,我设想了一些可能的原因:
- 程序存在内存泄漏
- worker进程或者taskWorker进程队列堆积
- 程序执行时遇到致命错误
- 系统设置存在问题
通过对进程和内存的仔细观察,基本排除了内存泄漏的可能。目前swoole服务每天处理100多万个请求,260万的taskWorker,我感觉这个量算不上特别大,也修改过worker进程或taskWorker进程数量,问题依旧,所以我觉得也不是第二个原因造成的。
目前,我使用公司的mes系统对服务进行实时监控,主要是监测某一项任务中执行时间大于等于5秒的任务占全部任务的比例,正常值应在0.5%以下,超过这个数值会给我发短信报警,目前只能通过重启服务来解决
今天依据swoole官网的文档,对服务器的系统参数进行了调优,准备观察一下看看,如果问题不再出现就说明是参数设置的问题,另外我还会想一些办法对异常错误进行捕获,如果还出问题,就再找原因呗 ╮(╯▽╰)╭
以下是一些常用命令及系统调优方法
1.查看内存占用的命令
2.修改ulimit
(a)说明:Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量)。
查看:
(b)说明:可以产生coredump且不受大小限制
查看:
查看全部配置
(c)设置 /etc/security/limits.conf
加入:
3.修改 /etc/sysctl.conf
加入:
说明:
max_dgram_qlen : 最大数据报个数
swoole使用unix socket dgram来做进程间通信,如果请求量很大,需要调整此参数。系统默认为10,可以设置为100或者更大。或者增加worker进程的数量,减少单个worker进程分配的请求量。
- wmem_max : 最大的TCP数据发送缓冲
- rmen_max : 最大的TCP数据接收缓冲
- kernel.core_pattern : 开启CoreDump,一旦程序发生异常,会将进程导出到文件。对于调查程序问题有很大的帮助, 必须先确认 ulimit -c 不为零
使生效:
查看:
结束语:最近发现自己表面上好像对swoole用的挺熟,其实只是知道了一些皮毛而已,实在不足挂齿。