继系列一之 大内存 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 聊聊, 查看更多联系方式