美文网首页linux运维
记一次服务器cpu不稳定排查笔记!

记一次服务器cpu不稳定排查笔记!

作者: DragonersLi | 来源:发表于2021-07-09 19:32 被阅读0次

    cpu忽高忽低,负载100%。

    top #按c查看cpu和内存占用程序进程详细信息
    ps auxw|head -1;ps auxw|sort -rn -k4|head -50      #查看消耗内存最多的前50个进程
    ps -ef |grep "php-fpm"|grep "pool"|wc -l #查看服务器上一共开了多少的 php-cgi 进程
    netstat -anp|grep "php-fpm"|grep "tcp"|grep "pool"|wc -l #查看已经有多少个php-cgi进程用来处理tcp请求
    
    strace -p PID #跟踪占用CPU高的进程ID
    ll /proc/PID/fd #查看该进程在处理哪些文件
    

    安装opcache缓存器加速php脚本

    记录慢日志

    #/www/server/php/74/etc/php-fpm.conf 
    request_slowlog_timeout = 3 #php慢日志超过3秒记录
    slowlog = /var/log/slow.log #记录慢日志文件位置
    

    服务器cpu原本8核16G,cpu忽高忽低。导致高至100%时访问出错或变慢。为了业务正常访问,先升级到16核32G,然后慢慢找原因。发现升级后还是老样子。只是相比原来改善了点。
    topc查看php-fpm进程是哪个脚本占cpu
    ls -l /proc/PIDll /proc/PID查看进程详细信息,Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径。

    cwd符号链接的是进程运行目录
    exe符号连接就是执行程序的绝对路径
    cmdline就是程序运行时输入的命令行命令
    environ记录了进程运行时的环境变量
    fd目录下是进程打开或使用的文件的符号连接,`ls /proc/PID`可查看
    
    
     [root@paijinhua ~]# ls -l /proc/28273
    total 0
    dr-xr-xr-x 2 www  www  0 Jul  9 19:21 attr
    -rw-r--r-- 1 root root 0 Jul  9 19:21 autogroup
    -r-------- 1 root root 0 Jul  9 19:21 auxv
    -r--r--r-- 1 root root 0 Jul  9 10:54 cgroup
    --w------- 1 root root 0 Jul  9 19:21 clear_refs
    -r--r--r-- 1 root root 0 Jul  9 10:54 cmdline
    -rw-r--r-- 1 root root 0 Jul  9 10:54 comm
    -rw-r--r-- 1 root root 0 Jul  9 19:21 coredump_filter
    -r--r--r-- 1 root root 0 Jul  9 19:21 cpuset
    lrwxrwxrwx 1 root root 0 Jul  9 11:00 cwd -> /www/wwwroot/PROJECT/public
    -r-------- 1 root root 0 Jul  9 19:21 environ
    lrwxrwxrwx 1 root root 0 Jul  9 10:54 exe -> /www/server/php/74/sbin/php-fpm
    dr-x------ 2 root root 0 Jul  9 10:55 fd
    dr-x------ 2 root root 0 Jul  9 19:21 fdinfo
    -rw-r--r-- 1 root root 0 Jul  9 19:21 gid_map
    -r-------- 1 root root 0 Jul  9 19:21 io
    -r--r--r-- 1 root root 0 Jul  9 19:21 limits
    -rw-r--r-- 1 root root 0 Jul  9 19:21 loginuid
    dr-x------ 2 root root 0 Jul  9 19:21 map_files
    -r--r--r-- 1 root root 0 Jul  9 19:21 maps
    -rw------- 1 root root 0 Jul  9 19:21 mem
    -r--r--r-- 1 root root 0 Jul  9 19:21 mountinfo
    -r--r--r-- 1 root root 0 Jul  9 19:21 mounts
    -r-------- 1 root root 0 Jul  9 19:21 mountstats
    dr-xr-xr-x 5 www  www  0 Jul  9 19:21 net
    dr-x--x--x 2 root root 0 Jul  9 19:21 ns
    -r--r--r-- 1 root root 0 Jul  9 19:21 numa_maps
    -rw-r--r-- 1 root root 0 Jul  9 19:21 oom_adj
    -r--r--r-- 1 root root 0 Jul  9 19:21 oom_score
    -rw-r--r-- 1 root root 0 Jul  9 19:21 oom_score_adj
    -r--r--r-- 1 root root 0 Jul  9 19:21 pagemap
    -r-------- 1 root root 0 Jul  9 19:21 patch_state
    -r--r--r-- 1 root root 0 Jul  9 19:21 personality
    -rw-r--r-- 1 root root 0 Jul  9 19:21 projid_map
    lrwxrwxrwx 1 root root 0 Jul  9 11:00 root -> /
    -rw-r--r-- 1 root root 0 Jul  9 19:21 sched
    -r--r--r-- 1 root root 0 Jul  9 19:21 schedstat
    -r--r--r-- 1 root root 0 Jul  9 19:21 sessionid
    -rw-r--r-- 1 root root 0 Jul  9 19:21 setgroups
    -r--r--r-- 1 root root 0 Jul  9 19:21 smaps
    -r--r--r-- 1 root root 0 Jul  9 19:21 stack
    -r--r--r-- 1 root root 0 Jul  9 10:54 stat
    -r--r--r-- 1 root root 0 Jul  9 11:00 statm
    -r--r--r-- 1 root root 0 Jul  9 10:54 status
    -r--r--r-- 1 root root 0 Jul  9 19:21 syscall
    dr-xr-xr-x 3 www  www  0 Jul  9 19:13 task
    -r--r--r-- 1 root root 0 Jul  9 19:21 timers
    -rw-r--r-- 1 root root 0 Jul  9 19:21 uid_map
    -r--r--r-- 1 root root 0 Jul  9 19:21 wchan
    
    [root@xxx]# ls /proc/1946
    attr       clear_refs       cpuset   fd       limits     mem         net        oom_score      personality  schedstat  stack   syscall  wchan
    autogroup  cmdline          cwd      fdinfo   loginuid   mountinfo   ns         oom_score_adj  projid_map   sessionid  stat    task
    auxv       comm             environ  gid_map  map_files  mounts      numa_maps  pagemap        root         setgroups  statm   timers
    cgroup     coredump_filter  exe      io       maps       mountstats  oom_adj    patch_state    sched        smaps      status  uid_map
    
    
    

    cat /www/server/php/74/etc/php-fpm.conf 查看最后两行php慢日志位置和时间。
    tail -f /var/log/slow.log查看日志内容,像流水一样哗哗记录。不过这些都是框架底层代码,
    不是自己写的无法定位自己写的代码去优化。php性能追踪及分析工具XHProf也看不出来问题。

    error_log = /www/server/php/74/var/log/php-fpm.log
    log_level = notice
    
    [www]
    listen = /tmp/php-cgi-74.sock
    listen.backlog = 8192
    listen.allowed_clients = 127.0.0.1
    listen.owner = www
    listen.group = www
    listen.mode = 0666
    user = www
    group = www
    pm = ondemand
    pm.status_path = /phpfpm_74_status
    pm.max_children = 120
    pm.start_servers = 10
    pm.min_spare_servers = 10
    pm.max_spare_servers = 30
    request_terminate_timeout = 30
    request_slowlog_timeout = 3
    slowlog = /var/log/slow.log 
    
    

    排查: 第一行猜测应该是进程ID,script_filename都是入口index.php,根据下面框架底层代码文件判断大致问题所在。
    既然有session,怀疑session配置有问题。驱动由file改成cache,在cache配置文件修改default默认驱动由file改成redis。然后添加redis缓存驱动!
    既然有db/PDOConnection.php,那应该是sql问题,排查慢sql日志。

    thinkphp6的config目录下session.php配置文件

    <?php
    // +----------------------------------------------------------------------
    // | 会话设置
    // +----------------------------------------------------------------------
    
    return [
        // session name
        'name'           => 'PHPSESSID',
        // SESSION_ID的提交变量,解决flash上传跨域
        'var_session_id' => '',
        // 驱动方式 支持file cache
        'type'           => 'cache',
        // 存储连接标识 当type使用cache的时候有效
        'store'          => null,
        // 过期时间
        'expire'         => 86400,
        // 前缀
        'prefix'         => 'session_',
    ];
    
    

    thinkphp6的config目录下cache.php配置文件

    <?php
    
    // +----------------------------------------------------------------------
    // | 缓存设置
    // +----------------------------------------------------------------------
    
    return [
        // 默认缓存驱动
        'default' => env('cache.driver', 'redis'),
    
        // 缓存连接方式配置
        'stores'  => [
            'file' => [
                'type'       => 'File',// 驱动方式
                'path'       => '', // 缓存保存目录
                'prefix'     => '',// 缓存前缀
                'expire'     => 0, // 缓存有效期 0表示永久缓存
                'tag_prefix' => 'tag:',// 缓存标签前缀
                'serialize'  => [], // 序列化机制 例如 ['serialize', 'unserialize']
            ],
            // 更多的缓存连接
            // redis缓存
            'redis'   =>  [
                'type'   => 'redis',// 驱动方式
                'host'  =>  env('redis.host', '127.0.0.1'), // 服务器地址
                'port' => env('redis.port', '6379'), 
                'password' => env('redis.password', ''),
            ],
        ],
    ];
    
    
    慢日志记录内容session
    慢日志记录内容PDOConnection
    更改驱动后redis记录的数据

    相关文章

      网友评论

        本文标题:记一次服务器cpu不稳定排查笔记!

        本文链接:https://www.haomeiwen.com/subject/yvqarxtx.html