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

文章目录

    继系列一之 大内存 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式