最近鉴于实在受不了WordPress+PHP的性能,还有服务器的MySQL频繁未知原因宕机重启,整顿一波服务器。
本服务器运行于1C1T1G的配置上,使用
Swap篇
swap即服务器的虚拟内存大小,太小会导致系统杀进程(上述的MySQL频繁停止原因就是此)。若你swap已经正常配置,跳过这一步。
- 检查服务器虚拟内存使用情况
%Cpu(s): 41.3 us, 6.0 sy, 0.0 ni, 49.7 id, 2.3 wa, 0.0 hi, 0.0 si, 0.7 st
MiB Mem : 961.5 total, 67.9 free, 833.4 used, 204.6 buff/cache
MiB Swap: 1452.0 total, 1452.0 free, 0.0 used. 128.1 avail Mem可以看到上面swap使用率为0,说明服务器根本没有尝试压缩内存到swap内,导致WordPress上传文件的时候kswapd0会尝试疯狂换页,导致MySQL被杀死。(下为上传一个文件时的性能情况)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
44 root 20 0 0 0 0 R 57.0 0.0 0:08.97 kswapd0
2014 mysql 20 0 941260 322240 2944 S 12.3 32.7 0:09.34 mysqld
3169 www 20 0 120552 36784 2432 R 4.6 3.7 0:02.42 php-fpm
947 www 20 0 151924 28504 2304 R 3.3 2.9 0:00.91 nginx
2446 root 20 0 247048 12132 2560 S 3.3 1.2 0:01.69 python3
3168 www 20 0 127208 43780 2304 R 3.3 4.4 0:03.04 php-fpm
3197 www 20 0 97428 12364 1920 R 2.3 1.3 0:00.21 php-fpm
2249 root 20 0 426436 73312 2816 R 2.0 7.4 0:05.16 BT-Panel
3192 root 20 0 38376 21144 2688 R 2.0 2.1 0:00.82 python3
3200 root 20 0 12392 3456 2304 R 1.7 0.4 0:00.09 sshd
755 root 20 0 80712 2688 2432 R 1.3 0.3 0:00.49 qemu-ga
3202 root 20 0 12020 3328 2304 S 1.3 0.3 0:00.09 sshd解决方案:
cat /proc/sys/vm/swappiness先用这条指令查看swappiness,若为10或更低就执行:
echo 'vm.swappiness=60' | sudo tee -a /etc/sysctl.conf
// 下面这条命令的=0改成你在cat时看到的swappiness值
sudo sed -i '/vm.swappiness=0/d' /etc/sysctl.conf
sudo sysctl -w vm.vfs_cache_pressure=100
sudo sysctl -p之后可以看到系统内存有很明显的缓解。
PHP性能调优
通过限制PHP并发达到控制内存使用,打开PHP的FPM配置文件,找到下列左侧key,分别这么写入:
pm = dynamic
pm.max_children = 2
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 100此法会限制FPM开启的最大进程数。同时在php.ini配置文件中找到memory_limit并修改为:
memory_limit=64M接下来安装PHP的OPCache扩展:

随后继续打开php.ini,滑倒最底下可以看到新增的OPCache配置内容。
除了zend_extension,可以直接copy本配置到php.ini替换原来的Opcache配置。
[Zend Opcache]
zend_extension=/www/server/php/84/lib/php/extensions/no-debug-non-zts-20240924/opcache.so
opcache.enable = 1
opcache.memory_consumption=64
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.jit_buffer_size=64m
opcache.jit=1205
opcache.validate_timestamps=1MySQL优化

如图。注意innodb_buffer_pool_size不能太小,否则性能会出现问题。
end
至此,服务器从原来的响应一个小链接要2~4s,到现在能做到缓存后秒开,可喜可贺,可喜可贺。