小项目使用单台机器,2核4G,使用CentOS+Nginx+MySQL+PHP环境搭建的抢购活动。前台Vue+Laravel框架提供API及后管,使用Redis防止超售问题。

优化前使用默认的lnmp配置,活动开始后基本卡死,php-fpm日志记录到线程数量不够、CPU占用90%以上。慢日志中发现laravel include过多文件导致磁盘IO过高,网站请求变慢,进而导致nginx日志中过多的499状态码(客户端主动关闭),用户体验效果很差。

我使用的几条优化方法:

  1. 首先尽量减少抢购过程中的mysql查询,转移到Redis储存,开启Redis持久化,防止宕机后的数据丢失。
  2. 优化PHP-FPM,启动多个php-fpm master进程来分担过多的php请求,比如我启动了四个php-fpm。Nginx中使用upstream进行负载均衡。
  3. 手动指定Nginx的worker_processes和worker_cpu_affinity,我设置为双倍,即worker_processes 4、worker_cpu_affinity 0001 0010 0100 1000。
  4. 启用opcache解决php磁盘占用过高的问题,opcache缓存php编译后的字节码,直接跳过前期的文件相互引用和编译解释过程,效果明显。

测试优化富贵论坛后,并发能稳定在140左右,基本无错误,响应很快,体验提高很多。