内存溢出

在Swoole中很难定位内存溢出的bug点,为了防止内存溢出,在应用中不要直接调用自定义的静态类,若有必要调用,可以先将实例存储在\x\Container请求级容器中。
而且在sw-x status指令中,可以查看到当前应用的内存状态和\x\Container容器长度,
若内存一直飙升,容器长度无法下降的话的,就表示应用代码中发生了溢出现象,需要自行审计代码。

如果担心sw-x status不准的话,也可以使用linux的free -h,压测的过程中,开新窗口,查看打印出来的free有没有被回收,没的话就代表内存溢出了。

关于Swoole内存溢出的问题,之前认为没必要在文档中解析这个问题,但最近有些开发者向我咨询了,我还是觉得有必要讲解下。
1、由于Swoole是常驻内存的,所以静态类 或 静态方法所占用的内存开销,在Swoole中不会自动释放,需要手动unset销毁,这点需要注意,SW-X已经强制控制器的方法不再支持静态方法定义。
但若开发者自行封装处业务类时,也要谨慎使用静态属性定义。

2、还有global全局变量声明,在Swoole中服务可分为进程级、请求级,进程级对应Worker进程,请求级则对应其下的子线程,若在业务代码中声明变量为global,则该变量会从请求级升级为进程级变量,届时变量将无法自动销毁,因为Swoole会在请求结束自动释放其子线程所占用的内存开销,但不会销毁Worker进程相关的内存占用。

3、不要在代码中执行sleep以及其他睡眠函数,这样会导致整个Worker进程阻塞

4、不要在代码中执行exit\die,这样会导致整个Worker进程死亡