在Swoole中很难定位内存溢出的bug点,为了防止内存溢出,在应用中不要直接调用自定义的静态类,若有必要调用,可以先将实例存储在\x\context\Container
上下文容器中。
而且在sw-x status
指令中,可以查看到当前应用的内存状态,
若内存一直飙升无法下降的话的,就表示应用代码中发生了溢出现象,需要自行审计代码。
如果担心sw-x status
不准的话,也可以使用linux的free -h
,压测的过程中,开新窗口,查看打印出来的free
有没有被回收,没的话就代表内存溢出了。
关于Swoole内存溢出的问题,之前认为没必要在文档中解析这个问题,但最近有些开发者向我咨询了,我还是觉得有必要讲解下。
unset
销毁,这点需要注意,SW-X已经强制控制器的方法不再支持静态方法定义。global
全局变量声明,在Swoole中服务可分为进程级、请求级,进程级对应Worker
进程,请求级则对应其下的子线程
,若在业务代码中声明变量为global
,则该变量会从请求级升级为进程级变量,届时变量将无法自动销毁,因为Swoole会在请求结束自动释放其子线程所占用的内存开销,但不会销毁Worker
进程相关的内存占用。
sleep
以及其他睡眠函数,这样会导致整个Worker进程阻塞exit\die
,这样会导致整个Worker进程死亡,进而不断自动重启