美文网首页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