^ _ ^ Linux负载之进程管理ps、pidstat、dstat、top、htop与负载试验
^ _ ^ linux中memory内存管理
Linux进程管理ps、pidstat、dstat、top、htop与负载试验
1、进程概述
父进程复制自己的地址空间 ( fork ) 创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID ( PID ),满足跟踪安全性之需。
任何进程都可以创建子进程。
所有进程都是第一个系统进程的后代。
Centos5/6系统进程:init
Centos7+系统进程:systemd
1.1、查看当前CPU几核几线程
cpu个数:是指物理上cpu的个数。
cpu核心数:是指物理上,也就是硬件上存在着几个核心。比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组。
cpu线程数:是一种逻辑上的概念,简单地说,就是模拟出的CPU核心数。(比如:可以通过一个物理的CPU核心模拟出2线程的CPU。一个物理的CPU核心最少对应一个线程,但通过超线程技术,一个核心可以对应两个线程,也就是说它可以同时运行两个线程。)
在Linux中,可以利用grep命令来查看CPU的核心数和线程数。
1、查看CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
2、查看每个CPU的核心数
grep 'core id' /proc/cpuinfo | sort -u | wc -l
3、查看线程数
grep 'processor' /proc/cpuinfo | sort -u | wc -l
-
例1:1物理2核心4线程
此服务器有1个CPU,每个CPU有2个核心,每个核心有2个线程,所以线程数为4。 -
例2:1物理4核心4线程
此服务器有1个CPU,每个CPU有4个核心,每个核心有1个线程,所以线程数为4。
1.2、父进程and子进程
1.3、进程的生命周期
1.4、对CPU负载的理解
可以将CPU负载理解为车道的负载,对单车道而言:
如果路面上的车不多,没有占满车道,那么load < 1;
如果占满了车道,load = 1;
如果车道外面还有车在等待,load > 1;
需要注意的是,load = 1 不代表CPU无法工作了,这只是表示满负荷运行,例如实际生活中的例子,车道占满了,但是车流还能有序前进。
平均负载基本概念
平均负载是指单位时间内,系统处于R状态与D状态的平均进程数,与cpu使用率无关,进程状态可使用 ps -aux 查看。
平均负载理想状态下等于CPU个数;
CPU个数查询cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
;
例如在2个CPU的机器上,平均负载为1,那么cpu有50%的空闲,当平均负载大于cpu个数时,表示系统出现过载,过载超过cpu数量70%时,需要排查负载过高问题。
1.5、使用signal控制进程
信号的种类:kill -l
列出支持的信号。
信号9,15:9) SIGKILL:。15) SIGTERM:
kill -1 8878
kill -9 8878
kill -15 8878
编号) 信号名 汉语描述
1
) SIGHUP 重新加载配置。
2
) SIGINT 键盘中断Ctrl + C。
3
) SIGQUIT 键盘退出Ctrl + \,类似SIGINT。
9
) SIGKILL 强制终止,无条件。
15
) SIGTERM 终止(正常结束),缺省信号。
18
) SIGCONT 继续。
19
) SIGSTOP 暂停。
20
) SIGTSTP 键盘暂停Ctrl+Z。
1.6、前后进程Process控制
&
jobs
fg
bg
1.7、虚拟文件系统/proc/*
虚拟文件系统:采集服务器自身 内核、进程 运行的状态信息。
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/cmdline
2、top 命令
top:动态列出 Linux 进程。
2.1 top 字段显示说明
top - 20:06:18 up 13 min, 1 user, load average: 0.00, 0.01, 0.05
20:06:18:当前时间
up 13 min:运行时长
1 user:登录当前系统上的用户数
load average: 0.00, 0.01, 0.05:1分钟,5分钟,15分钟的负载压力【平均负载(等待运行的队列长度的负载)。建议不能超过5,超过5会导致宕机。】(如果三个参数值差距不大,表示系统负载平稳;当1分钟的值比5分钟或15分钟的值小很多,表示最近1分钟负载减少;反之表示最近1分钟负载增加;)
Tasks: 91 total, 1 running, 90 sleeping, 0 stopped, 0 zombie
Tasks: 任务
91 total:一共运行多少进程
1 running:几个进程处于运行
90 sleeping:多少个进程处于睡眠
0 stopped:多少个停止
0 zombie:多少个僵尸进程
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu:cpu 占用百分比。
0.0 us:用户空间占用CPU百分比 “user CPU time”。
0.3 sy:内核空间占用CPU百分比 “system CPU time”。
0.0 ni:用户进程空间内改变过优先级nice值的进程占用CPU百分比 “nice CPU time”。
99.7 id:空闲CPU百分比 “idle”。
0.0 wa(wait):等待IO输入输出的CPU时间百分比 “iowait” 。
0.0 hi:处理硬件中断所占用的百分比 “hardware irq”。
0.0 si:处理软件中断所占用的百分比 “software irq”。
0.0 st:被偷走的百分比(虚拟化程序) “steal time”。
KiB Mem : 8154928 total, 6916884 free, 598484 used, 639560 buff/cache
KiB Mem:内存空间占用,以 KB 为单位:
8154928 total:总内存空间
6916884 free:剩余内存空间
598484 used:已用内存空间
639560 buff/cache:用于缓存和缓冲的内存空间
KiB Swap: 2097148 total, 2097148 free, 0 used. 7302244 avail Mem
KiB Swap:swap 空间占用,以 KB 为单位
2097148 total:总空间
2097148 free:剩余空间
0 used:已用空间
7302244 avail Mem :有效 swap 大小
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1206 mysql 20 0 1204216 190060 6160 S 3.0 2.3 0:03.89 mysqld
814 rabbitmq 20 0 2287908 83312 4372 S 1.3 1.0 0:16.02 beam.smp
PID:用户 pid
USER:用户名称
PR:优先级
NI:nice 值
VIRT:占用virtual size 虚拟内存集
RES:常驻内存集;
SHR:共享内存空间
S:当前状态
%CPU:占据 CPU 百分比
%MEM:占据 MEM 百分比
TIME+:运行时长
COMMAND:命令
2.2 top 内排序
按 P:以占据 CPU 百分比排序
按 M:以占据内存百分比排序
按 T:累积占用 CPU 时间排序
2.3 首部信息命令
按 l 命令:(小写的L)uptime 信息。
按 t 命令:tasks 及 cpu 信息;可以禁用显示硬盘及 cpu 相关消息。
按 m 命令:内存信息;可以将内存使用率用 |||
显示 或者 白空格
显示。
按 s 命令:修改刷新时间间隔。
按 k 命令:终止指定的进程。
按 q 命令:退出命令。
选项:
-d #
:指定刷新时间间隔,默认为 3 秒。
-b
:以批次方式显示。
-n #
:显示多少批次。
2.4 top小试验
间隔每3s监控一次
top -d 3
间隔每3s监控一次进程pid为 2166 和 9655
top -d 3 -p 2166,9655
3 dstat 命令
dstat:dstat 是一个性能统计工具(动态);用于监测系统 CPU、内存、磁盘和网络等资源的使用情况,同时还可以生成有关性能指标的实时图表。
yum install dstat -y
dstat [-afv] [options..] [delay [count]]
1、是每5s显示一条。
dstat 5
2、表示每5s显示一条,一共显示3条。
dstat 5 3
3、打印各项性能指标的实时信息;默认使用的是-cdngy参数。
此命令将在终端中显示各项性能指标的实时信息,包括 CPU 使用率、内存使用率、磁盘 I/O 等。
dstat 2 2
dstat -cdngy 1 1
4、输出 cpu 使用率、内存和磁盘 I/O 的实时图表
此命令将通过 dstat 获得 cpu 使用率、内存和磁盘 I/O 的实时数据,并在终端中生成对应的实时图表。
dstat -c --mem --io 1 1
5、输出网络 I/O 情况
此命令将显示网络的 I/O 情况,包括网络接口的传输速度、包数量等。
dstat -n 1 1
6、输出进程信息
此命令将显示正在运行的进程的相关信息,包括 CPU 使用率、内存使用率、进程数量等。
dstat -p 1 1
7、输出系统负载信息;
此命令将显示系统负载信息,包括 CPU 使用率、I/O 等。
dstat -l 1 1
8、输出完整的模块列表;此命令将显示全部可用的模块。
dstat --list
dstat 是一款非常强大的系统性能监控工具,对于系统管理员来说,它是一个必不可少的性能监测工具。
4 ps 命令
用于显示当前进程的状态(非动态)。
ps [options]
选项有三种风格:
1、UNIX 风格 —— 必须在选项前面加 -
。
2、BSD 风格 —— 选项前不能加 -
。
3、GNU 风格 —— 选项前为两个 -
。
4.1、ps aux
a:所有与终端相关的进程。
x:所有与终端无关的进程。
u:以用户为中心组织进程状态信息显示。
ps aux
☆☆☆☆☆☆使用grep后显示表头的折中方法☆☆☆☆☆☆
ps aux | grep -E "^USER|mysql"
ps auxw | head -1; ps auxw | grep "ssh"
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
USER
:用户。
PID
:进程号。
CPU%
:cpu 时间占用比率。
MEM%
:内存占用百分比。
VSZ
:占用虚拟内存;virtual size 虚拟内存集(硬盘)。
RSS
:占用实际内存;Resident Size,常驻内存集。
TTY
:终端类型:?是系统打开的;pts/0终端。
STAT
:进程状态 man ps (/STATE)。
R
:running 运行。
S
:interruptable sleeping 可中断睡眠。
D
:uninterruptable sleeping 不可中断睡眠。
T
:Stopped 停止。
Z
:zombie 僵死态。
+
:前台进程。
l
:多线程进程。
N
:低优先级进程。
<
:高优先级进程。
s
:session leader 进程领导者。
START
:进程的启动时间。
TIME
:进程占用CPU的总时间。
COMMAND
:程序。
指定列升降序排列
ps aux --sort=+%cpu 升序
ps aux --sort=-%cpu 降序
4.2、ps -ef
-e:显示所有进程
-f:显示完整格式的进程信息
4.3、ps -eFH
-F:显示完整格式的进程信息;
C:cpu utilization cpu 占用百分比
PSR:运行于哪颗 CPU 之上
-H:以层级结构显示进程的相关信息;
4.4、ps -eo, axo
ps -eo field1, field2, …
:自定义要显示的字段列表,以逗号分隔
ps axo field1, field2, …
:自定义要显示的字段列表,以逗号分隔
常用的 field:pid, ni, priority, psr, pcpu, stat, comm, tty, ppid, rtprio
pid:进程的 pid 号
ni:nice 值(nice)
priority:优先级
psr:运行在那颗 cpu
pcpu:cpu 利用率
ppid:父进程的 id 号
rtprio:实时优先级
ps axo user,pid,ppid,%cpu,%mem,tty,stat,start,time,command | head -n3
ps axo user,pid,ppid,ni,priority,psr,cpu,pcpu,stat,tty,rtprio | head -n3
ps -eo user,pid,ppid,%cpu,%mem,tty,stat,start,time,command | head -n3
ps -eo user,pid,ppid,ni,priority,psr,cpu,pcpu,stat,tty,rtprio | head -n3
4.5、进程状态 PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped by job control signal
t stopped by debugger during the tracing
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
小例子
1、查询端口号占用,根据端口查看进程信息
lsof -i:8001
2、根据进程号查看进程对应的可执行程序
ps -f -p 8141
3、手工终止进程的运行
kill -9 8041
5、pidstat 命令
pidstat - Report statistics for Linux tasks.
在Debian/Ubuntu系统:
apt-get install -y sysstat
在CentOS/Fedora/RHEL系统:
yum install -y sysstat
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
-u
:默认的参数,显示各个进程的cpu使用统计。
-r
:显示各个进程的内存使用统计。
-d
:显示各个进程的IO使用情况。
-p
:指定进程号。
-w
:显示每个进程的上下文切换情况。
-t
:显示选择任务的线程的统计信息外的额外信息。
-T { TASK | CHILD | ALL }
:这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-h
:在一行上显示了所有活动,这样其他程序可以容易解析。
-I
:在SMP环境,表示任务的CPU使用率/内核数量。
-l
:显示命令名和所有参数。
5.1、查看所有进程的CPU使用统计( -u -p ALL)
显示各活动进程的cpu使用统计
pidstat
pidstat -u -p ALL
pidstat =等效于= pidstat -u =等效于= pidstat -u -p ALL
PID
:进程ID。
%usr
:进程在用户空间占用cpu的百分比。
%system
:进程在内核空间占用cpu的百分比。
%guest
:进程在虚拟机占用cpu的百分比。
%wait
:
%CPU
:进程占用cpu的百分比。
CPU
:处理进程的cpu编号。
Command
:当前进程对应的命令。
5.2、内存使用情况统计(-r)
显示各活动进程的内存使用统计
pidstat -r
PID
:进程标识符
minflt/s
:任务每秒发生的次要错误,不需要从磁盘中加载页。
majflt/s
:任务每秒发生的主要错误,需要从磁盘中加载页。
VSZ
:虚拟地址大小,虚拟内存的使用KB。
RSS
:常驻集合大小,非交换区五里内存使用KB。
%MEM
:
Command
:task命令名。
5.3、显示各个进程的IO使用统计(-d)
pidstat -d
PID
:进程id。
kB_rd/s
:每秒从磁盘读取的KB。
kB_wr/s
:每秒写入磁盘KB。
kB_ccwr/s
:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
iodelay
:
COMMAND
:task的命令名。
5.5、显示每个进程的上下文切换统计(-w)
pidstat -w -p 10379
PID
:进程id。
cswch/s
:每秒主动任务上下文切换数量。
nvcswch/s
:每秒被动任务上下文切换数量。
Command
:命令名。
5.6、显示选择任务的线程的统计信息外的额外信息 (-t)
pidstat -t -p 10379
TGID
:主线程的表示。
TID
:线程id。
%usr
:进程在用户空间占用cpu的百分比。
%system
:进程在内核空间占用cpu的百分比。
%guest
:进程在虚拟机占用cpu的百分比。
%CPU
:进程占用cpu的百分比。
CPU
:处理进程的cpu编号。
Command
:当前进程对应的命令。
5.7、pidstat -T
// TASK表示报告独立的task
pidstat -T TASK
// CHILD表示报告进程下所有线程统计信息
pidstat -T CHILD
// ALL表示报告独立的task和task下面的所有线程
pidstat -T ALL
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
PID
:进程id。
usr-ms
:任务和子线程在用户级别使用的毫秒数。
system-ms
:任务和子线程在系统级别使用的毫秒数。
guest-ms
:任务和子线程在虚拟机(running a virtual processor)使用的毫秒数。
Command
:命令名。
6、htop 命令
htop: 交互式进程查看器。htop [-dus]。htop 是一个非常强大的工具,下面从 F1 到 F10 可以看到具体的参数信息。yum install htop -y
选项:
-d #:指定延迟时间间隔
-u UserName:仅显示指定用户的进程
-s COLUME:以指定字段进行排序
常用子命令:
l:显示选定的进程打开的文件列表
s:跟踪选定的进程的系统调用
t:以层级关系显示各进程状态
a:将选定的进程绑定至某指定的 CPU 核心
此处可以添加指定项到显示屏幕上面,显示方式可以是 [Bar] [Text] [Graph] [LED]
7、平均负载试验案例
yum install -y stress
使用8个进程对cpu;4个进程对硬盘IO;2个进程对内存;5个进程对文件(创建、写入、删除)压测10s。
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --hdd 5 --timeout 10s
7.1、cpu密集型负载试验
通过stress工具模拟cpu使用率100%场景
stress --cpu 1 --timeout 300
查看平均负载及cpu占用情况
top
pidstat -u 2 10
7.2、io密集型负载试验
通过stress工具模拟io密集型进程
stress -i 1 --timeout 300
top查看平均负载,
io使用率需通过mpstat -P ALL 5 10(5秒统计一次,统计10次)查看。
当iowait较高时使用pidstat -d 2 10找到对应进程。
-bash: mpstat: command not found
可通过 yum -y install sysstat
安装
7.3、大量进程负载试验
stress -c 8 --timeout 600模拟8个进程,
top或
pidstat -u 2 10查看平均负载以及进程占用情况。
7.4、负载试验小总结
当服务器响应缓慢时可先通过top或pidstat -u 2 10查看cpu以及平均负载情况。
对于cpu占用不高,但平均负载较高情况,考虑是否io密集型应用导致,可通过mpstat -P ALL 5 10查看io使用率,也可通过pidstat -d 2 10直接找到对应进程。