提前放一枚五四评优运维的flag

五四评优的运维,面临的最直接的问题在于大并发场景下php-fpm的进程不足,导致请求被挂起在nginx端,然后最终挂掉。在之前的 php5.6 时代,Rex采取的是使用静态的child processes,也就是设置 pm = static,然后给pm.max_children一个很大的值,这样在内存中就始终跑着无数个PHP,做到不至于阻塞。

这样的问题在于,给了PHP足够多的进程之后,分配给数据库的内存就很有限(毕竟小土豆只有12G内存),所以在历年高峰,还是会挂掉的,往往都是挂掉的时候伴随内存爆掉,还得手动restart

当然,PHP5 的性能本身就要背很大的过;其次 laravel 臃肿的身材也得背很大的锅。因为没人愿意重写系统,只能在其他方向找突破。

首先被动刀的自然是 PHP,我们“与时俱进”地把 php 升级到了 remi 源上的 7.1 版本,没错,opcache就是这么的诱人,也没让我们失望。php 版本切换对于 laravel5.1 最大点问题就是mcrypt加密件,这个 Rex 同志已经给我们解决了,放链接https://blog.rexskz.info/laravel-and-php-version-trap.html。然后我们把子进程改为 pm = dynamic,进行动态调配。我很随意的这么设置

pm.max_children = 800
pm.start_servers = 80
pm.min_spare_servers = 70
pm.max_spare_servers = 120
pm.process_idle_timeout = 10s
pm.max_requests = 200

不在这里再用中文讲每个参数的意义了,只讲讲最有意思的 pm.max_requests

; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0

emmm 每个进程处理多少个请求之后重启。默认是永不重启。我觉得...我们的小土豆芽,所谓 memory leaks 还是无法避免的,所以我们把这个配置稍微改的小了点,定次重启总比日后手动重启好很多。

除此之外,opcache 肯定是要开的咯,装好之后记得改一下配置,默认的配置还是很保守的。remi 对应的配置文件默认在 /etc/opt/remi/php71/php.d/10-opcache.ini

opcache.memory_consumption=256
opcache.revalidate_freq=60 ;没有动态的PHP的时候,这个值可以改的大一点
opcache.fast_shutdown=1

改改这仨,该调大调大,还是没有坏处滴。

因为怕 php 挂,所以写了个拙劣的jo本

#!/bin/bash
netcode=`curl -I -m 10 -o /dev/null -s -w %{http_code}  http://my.nuaa.edu.cn/watch.php`
if [ $netcode != 200 ]
then
    echo "`date +%Y%m%d-%H:%M:%S` php又挂啦...开始重启...emmm" >> /var/log/watchPhp
    systemctl restart php71-php-fpm.service
    echo "`date +%Y%m%d-%H:%M:%S` php重启结束!喵呜~" >> /var/log/watchPhp
fi

cron-tab 配置 * * * * * sh /root/network.sh ,每分钟来一次身体♂检查。

哇,很拙劣对不对,肯定会被大师傅耻笑的。

数据库方面,不用多说,最新版的 MariaDB ,缓存改大点,问题不大的(老师傅们当年并没有用 Redis...)

然后就是 Linux 大家都会注意到的问题了,不要倾向于使用 Swap

我把 /proc/sys/vm/swappiness 设置成了 5 还是比较激进的,现在的主流配置,5-15都是不错的选择呢~

关于 Swap,DO 的这篇文档是真的不错,最早就是这里学到的,推荐。

呜呜,但愿别出啥大问题吧,要稳健。来年有空一定重写,呜呜。

ps:本文没有严格区分 进程线程

发表评论