一台云服务器Ubuntu篇:7、nginx+php内存优化

nginx、php-fpm的内存占用查看

Oracle x86_64免费的1C1G VPS是1个CPU双线程:

Bash
$ cat /proc/cpuinfo | grep "processor" | wc -l # 查看逻辑 CPU 数量
2
$ cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l # 查看物理 CPU 数量
1
$ cat /proc/cpuinfo | grep "cpu cores" | uniq # 查看每个物理 CPU 的核心数
cpu cores       : 1

查看内存占用前10的应用: ps -Ao user,pid,ppid,%mem,rss,%cpu,cmd --sort=-rss|head -n 11

查看nginx、php-fpm、mariadb内存占用

在默认配置下,wordpress https+fastcgi_cache恢复完成+启用swap(vm.swappiness=40)后,有4个nginx进程(1主+2工作+1缓存),4个php-fpm进程(1主+3池)

  • nginx工作进程数量,与逻辑CPU数量相同;可以CPU的整数倍数,但不能小于,避免多个核心切换时会带来不必要的开销。
  • php-fpm每个池占用内容近70M,也与php扩展安装也有关系,也是要占内存的。
  • php-fpm有3个池,是默认为dynamic,开机2个,最大3个
  • mariadbd神奇只占35M,在开机时有100M+,但开机时swap使用为0。
Bash
$ ps -Ao user,pid,ppid,%mem,rss,%cpu,cmd --sort=+ppid|grep -E 'PID|nginx|php-fpm|mariadb'
USER         PID    PPID %MEM   RSS %CPU CMD
mysql      90339       1  3.6 36068  0.0 /usr/sbin/mariadbd
root      108561       1  0.8  8252  0.0 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
root      110157       1  3.2 31420  0.0 php-fpm: master process (/etc/php/8.3/fpm/php-fpm.conf)
www-data  117611  110157  9.2 90756  1.0 php-fpm: pool www
www-data  117822  110157  7.6 75288  0.9 php-fpm: pool www
www-data  117824  110157  8.6 84912  1.0 php-fpm: pool www
www-data  118124  108561  0.9  8904  0.1 nginx: worker process
www-data  118125  108561  0.9  9064  0.0 nginx: worker process
www-data  118126  108561  0.3  3852  0.0 nginx: cache manager process
lat       119296  119289  0.2  2072  0.0 grep --color=auto -E PID|nginx|php-fpm|mariadb

内存占用情况:swap在使用中

Bash
$ sudo free -h
               total        used        free      shared  buff/cache   available
Mem:           956Mi       448Mi       128Mi        55Mi       614Mi       508Mi
Swap:          2.0Gi       151Mi       1.9Gi

所以,在Oracle x86_64免费的1C1G VPS,且1个CPU是双线程,并不是双核心的;另外网站访问量不高。

  • 一个物理核心两个线程是超线程技术模拟的,实际性能提升有限,而且可能会因为上下文切换增加开销。nginx 使用auto会有2个worker_processes,手工直接指定1。
  • php-fpm为开机启动1个进程,被请求超过100次自动重启进程,单个请求最大执行35s;php进程内存限制,由默认无限改为在128M。

php.ini 配置

sudo vim /etc/php/8.3/fpm/php.ini
默认值为128M,所以可以不用改。

memory_limit = 128M

Zend OPcache

PHP官方提供的一个字节码缓存的内置扩展,用于优化PHP脚本的执行效率。它通过缓存已编译的操作码(opcode),避免每次请求都重新解析和编译脚本,从而显著提升性能。
OPcache主要有两种缓存方式:SHM(共享内存)缓存和文件缓存。此外,JIT(即时编译)是OPcache的一个特性,用于进一步提高性能。

  1. SHM Cache(共享内存缓存)
    • SHM缓存将编译后的操作码存储在共享内存中,这些内存可以被所有PHP进程访问。这意味着多个PHP进程可以共享相同的操作码缓存,从而减少内存使用并提高性能。
    • 在PHP.ini配置中,可以通过opcache.memory_consumption来设置共享内存的大小。
  2. File Cache(文件缓存)
    • 文件缓存将编译后的操作码存储在文件系统中,而不是共享内存中。这通常用于共享内存不足的情况,或者在某些环境中(如容器化环境)更容易管理。
    • 可以通过opcache.file_cache配置项来设置文件缓存的目录。
  3. JIT(Just-In-Time Compilation,即时编译)
    • JIT是OPcache的一个特性,它可以将PHP操作码动态编译为机器码,然后直接执行机器码,而不是由Zend虚拟机解释执行操作码。这可以显著提高CPU密集型任务的性能。
    • JIT在PHP 8.0中引入,并在后续版本中不断改进。在PHP 8.3中,JIT的配置和使用更加成熟。
    • JIT的配置主要通过opcache.jitopcache.jit_buffer_size等配置项进行。

从 https://blog.t725.cn/phpInfo.php#module_zend+opcache 看,默认是开启的。

php8.3-fpm 池的配置

sudo vim /etc/php/8.3/fpm/pool.d/www.conf

pm = static;
pm.max_children = 1;
pm.max_requests = 100;
request_terminate_timeout = 35;

nginx

sudo vim /etc/nginx/nginx.conf
两个工作进程可以提高访问响应速度,也可以考虑不改。

worker_processes 1/auto;

配置生效

sudo systemctl restart php8.3-fpm
sudo nginx -t && sudo nginx -s reload

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注