大内存 Magento PHP 服务器内存优化 (二)

更新日期: 2024-11-07 阅读次数: 172 字数: 891 分类: magento

继系列一之 大内存 Magento PHP 服务器内存优化,将 Linode 云服务器由 32G 内存,降配至 16G。最新的目标变成了,将 16G 内存的实例,进一步降低至 8G。

在请求量,并发量低的情况下,并不需要这么高的服务器配置。

系统负载

目前的 8核 16G 服务器,负载一直稳定在 1 左右。说明负载还是低。

内存使用状况

MiB Mem :  15975.1 total,    806.5 free,  11415.6 used,   3753.0 buff/cache
MiB Swap:    512.0 total,      3.1 free,    508.9 used.   4114.6 avail Mem

已使用内存,已经达到了 11G,远超 8G。需要进一步对各个服务进程的内存做更严格的限制。

排名前 9 的内存占用大户 top 榜:

$ ps -eo pid,ppid,cmd,%mem,rsz --sort=-rsz | head -n 10
    PID    PPID CMD                         %MEM   RSZ
   2150    1044 /usr/sbin/varnishd -a :6081 24.6 4027476
   1012       1 /usr/share/elasticsearch/jd 16.9 2765528
   5804    5525 /usr/local/mariadb/bin/mari 15.0 2461776
 609646    5825 php-fpm: pool www            1.5 248516
 564759    5825 php-fpm: pool www            1.5 246340
 718566    5825 php-fpm: pool www            1.4 229280
 564776    5825 php-fpm: pool www            1.2 204864
 653874    5825 php-fpm: pool www            1.1 196264
 564725    5825 php-fpm: pool www            1.1 187308

varnish 似乎没有限制住内存哇。。。

varnish 内存限制

我仔细看了一下,除了之前的 malloc 限制为了 2G。还有一个配置:

# unit is bytes
LimitMEMLOCK=85983232

这个配置的单位是字节,也就是 80M,不应该对内存造成这么大的影响啊。。。

暂时先将 malloc 参数调低至 1G。因为考虑到,还有内存碎片,及相关管理功能的内存占用,varnish 实际使用内存会高于 1G。 但是之前,malloc 设置了 2G,能飙到 4G 说明还是有很大的隐患。

更新配置,并重启 varnish:

sudo systemctl daemon-reload
sudo service varnish restart

varnish 内存机制还是没有搞明白,今天看内存已经涨到了 4G(前天看还是正常的,两天之内暴涨),之前限制到了 2G,似乎还有其他占用内存的功能。现在改成了 1G。 这个目前是唯一不可控的部分。如果还是限制不住,就得通过系统计划任务,每天凌晨重启一次。或者确认一下 systemd 是否支持通过内存限制的方式,到一定内存自动重启服务。但是这种方案存在一定的隐患,就是在业务高峰期重启服务带来的业务中断。

我感觉如果是我做缓存,还是用 redis 比较省心一点,这个 varnish 的概念不少,心智负担更大一些。

PHP 配置

现有配置:

pm = dynamic
pm.max_children = 20
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12

调低至

pm = dynamic
pm.max_children = 10
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6

重新加载 php fpm :

sudo service php-fpm reload

MySQL/mariadb 内存优化

/etc/my.conf

目前的配置:

innodb_buffer_pool_size = 2G

innodb_buffer_pool_size 配置参数来指定 InnoDB 缓冲池的大小。 缓冲池是一块内存区域,主要用于缓存 InnoDB 表的数据和索引。 其主要目的是减少磁盘 I/O。 当 MySQL 执行查询操作时,如果所需的数据页已经在缓冲池中,InnoDB 就可以直接从内存中读取数据,而无需从磁盘读取。因为磁盘 I/O 操作相对内存访问来说速度非常慢,这种缓存机制可以显著提高查询性能。例如,对于频繁访问的表数据,如一个电商网站中经常被查询的商品信息表,将数据缓存在缓冲池中可以大大加快查询速度。

改成 1G 试试,观察一段时间。

修改之后,重启生效:

sudo service mariadb restart

es(elasticsearch)JVM 内存限制

由 2G 调整为 1G。

sudo vim /etc/elasticsearch/jvm.options.d/jvm.options

-Xms1g
-Xmx1g

重启 ES 服务

sudo service elasticsearch restart

进入观察期

待观察几天,如果系统稳定,就进行降配操作。

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式