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,然后慢慢找原因。发现升级后还是老样子。只是相比原来改善了点。
top
按c
查看php-fpm
进程是哪个脚本占cpu
。
ls -l /proc/PID
或ll /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', ''),
],
],
];



网友评论