背景我来到新公司JamCulture担任CTO。看到代码性能很差,设备成本很高,就开始改造。有一个脚本,有一个执行了很长时间的脚本。旧的做法是为每个用户创建一个PHP进程。一共300人创建了300个流程。进程间频繁切换导致内存占用极高。最近产品经理需要把模拟用户增加到几千。老的process方式已经不能满足需求,所以使用了swoole协程。改造。使用框架ycroute(基于swoole协程的轻量级websocket框架):https://github.com/caohao-php/ycsocket改造前后性能对比如下:系统自身负载(4核8Gmachine)关闭流量,杀死PHP-FPM进程和Nginx进程后的负载原始内存=12.5%系统占用内存=6.3%=516M原始脚本多进程版机器1负载(8核32G内存)trafficCPUloadmemoryloadmemory占用24%,去掉系统占用的6%后(不确定32G内存是否需要6%),内存为18%x(32Gx1024)=5.9G内存占用。原脚本多进程版本机器2负载(8核16G内存)流量CPU负载内存负载内存占38%,去掉系统后占6%(不确定16G内存是否需要6%),内存为32%x(16Gx1024)=5.2G内存使用量。swoole协程版机器负载(4核8G内存)流量CPU负载内存负载内存占用7.2%,去掉系统占用6%后,内存为1.2%x(8Gx1024)=98M内存占用。综上所述,在流量大增的情况下,4核8G的机器可以应付需求,系统负载更低。
