prtstat -r,格式显示
[root@localhost ~]# prtstat -r 1121 pid: 1121 comm: sshd state: S ppid: 1 pgrp: 1121 session: 1121 tty_nr: 0 tpgid: -1 flags: 40402100 minflt: 1288 cminflt: 0 majflt: 9 cmajflt: 0 utime: 1 stime: 2 cutime: 0 cstime: 0 priority: 20 nice: 0 num_threads: 1 itrealvalue: 0 starttime: 2643 vsize: 108539904 rss: 1021 rsslim: 18446744073709551615 startcode: 94108043177984 endcode: 94108043995684 startstack: 140728038798720 kstkesp: 7FFDCCC32B58 kstkeip: 7F1FD7DE9783 wchan: 18446744071581032117 nswap: 0 cnswap: 18446744071581032117 exit_signal: 17 processor: 0 rt_priority: 0 policy: 0 delayaccr_blkio_ticks: 34 guest_time: 0 cguest_time: 0 复制代码
3.5 pstree命令——以树形结构列出进程信息
命令格式:
pstree [OPTION] [ PID | USER ] 复制代码
常用选项:
- -a:显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
- -p:显示PID。
- -p < pid> : 显示指定进程及其子进程,同时显示每个进程的PID。
- -u:显示进程的用户名称。
- -u 用户名:显示指定用户的进程。
- -H < pid>:高亮显示指定进程及其前辈进程。
- -T:不显示线程thread,默认显示线程。
示例:
1)pstree PID,显示指定进程及其子进程
[root@localhost ~]# pstree 1121 //显示1121进程及其子进程 sshd─┬─sshd─┬─bash───pstree │ ├─bash───top │ └─bash───sleep └─sshd───6*[sftp-server] 复制代码
2)pstree -p PID,显示指定进程及其子进程,同时显示PID。
[root@localhost ~]# pstree -p 1121 //显示1121进程及其子进程,同时显示PID sshd(1121)─┬─sshd(1872)─┬─bash(1876)───pstree(94984) │ ├─bash(1903)───top(2063) │ └─bash(94973)───sleep(94983) └─sshd(1902)─┬─sftp-server(1931) ├─sftp-server(1963) ├─sftp-server(1974) ├─sftp-server(1992) ├─sftp-server(2000) └─sftp-server(2019) 复制代码
3)pstree -u 用户名,显示指定用户的进程。
[root@localhost ~]# pstree -u nancy -p //显示nancy用户的进程,同时显示进程号。 bash(109643)───su(109754,root)───bash(109807)───pstree(110068) 复制代码
4)-a,显示启动进程的完整指令,包括启动进程的路径、参数等。
[root@localhost ~]# pstree 1645 -a //显示启动1645进程的完整指令 wpa_supplicant -u -f /var/log/wpa_supplicant.log -c/etc/wpa_supplicant/wpa_sup 复制代码
5)-aup,同时显示启动进程的完整指令、进程的所属用户、进程PID。
[root@localhost ~]# pstree -aup 复制代码
3.6 lsof命令——列举被打开的文件
lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
命令格式:
lsof [options] 复制代码
常用选项:
选项 | 功能 |
-c 字符串 | 只列出以字符串开头的进程打开的文件。 |
+d 目录名 | 列出某个目录中所有被进程调用的文件。 |
-u 用户名 | 只列出某个用户的进程打开的文件。 |
-p pid | 列出某个 PID 进程打开的文件。 |
示例:
[root@localhost ~]# lsof | more //查询系统中所有进程调用的文件 [root@localhost ~]# lsof +d /dev |more //显示/dev目录下所有被打开的文件及对应进程 [root@localhost ~]# lsof -u nancy //查询nancy用户打开的所有文件 [root@localhost ~]# lsof -p 655 //查询655进程打开的所有文件 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME xfs-log/s 655 root cwd DIR 253,0 4096 64 / xfs-log/s 655 root rtd DIR 253,0 4096 64 / xfs-log/s 655 root txt unknown /proc/655/exe [root@localhost ~]# lsof /bin/bash //查询打开/bin/bash文件的所有进程 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ksmtuned 894 root txt REG 253,0 960472 25197358 /usr/bin/bash bash 1955 root txt REG 253,0 960472 25197358 /usr/bin/bash bash 1983 root txt REG 253,0 960472 25197358 /usr/bin/bash bash 18235 nancy txt REG 253,0 960472 25197358 /usr/bin/bash bash 18439 root txt REG 253,0 960472 25197358 /usr/bin/bash bash 24904 root txt REG 253,0 960472 25197358 /usr/bin/bash 复制代码
3.7 vmstat命令——监控系统资源
如果想动态地了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。
3.7.1 vmstat命令格式一
vmstat [-a] [刷新延时 刷新次数] #-a:显示活跃和非活跃内存 复制代码
示例:
[root@localhost ~]# vmstat 3 2 //每3秒刷新一次,共执行2次 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 1223600 2332 370860 0 0 109 9 207 219 4 6 90 1 0 2 0 0 1223652 2332 370856 0 0 0 6 276 242 6 7 86 0 0 复制代码
查询出的信息共分6段,下面是具体说明:
字段 | 含义 |
procs | 进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。 |
memory | 内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。 -buff:缓冲的内存容量,单位为 KB。 -cache:缓存的内存容量,单位为 KB。 |
swap | 交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。 这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。 |
io | 磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。 |
system | 系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。 |
cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比 |
通过分析 vmstat 命令的执行结果,可以获得一些与当前 Linux 运行性能相关的信息。比如说:
- r 列表示运行和等待 CPU 时间片的进程数,如果这个值长期大于系统 CPU 的个数,就说明 CPU 不足,需要增加 CPU。
- swpd 列表示切换到内存交换区的内存数量(以 kB 为单位)。如果 swpd 的值不为 0,或者比较大,而且 si、so 的值长期为 0,那么这种情况下一般不用担心,不用影响系统性能。
- cache 列表示缓存的内存数量,一般作为文件系统缓存,频繁访问的文件都会被缓存。如果缓存值较大,就说明缓存的文件数较多,如果此时 I/O 中 bi 比较小,就表明文件系统效率比较好。
- 一般情况下,si(数据由硬盘调入内存)、so(数据由内存调入硬盘) 的值都为 0,如果 si、so 的值长期不为 0,则表示系统内存不足,需要增加系统内存。
- 如果 bi+bo 的参考值为 1000 甚至超过 1000,而且 wa 值较大,则表示系统磁盘 I/O 有问题,应该考虑提高磁盘的读写性能。
- 输出结果中,CPU 项显示了 CPU 的使用状态,其中当 us 列的值较高时,说明用户进程消耗的 CPU 时间多,如果其长期大于 50%,就需要考虑优化程序或算法;sy 列的值较高时,说明内核消耗的 CPU 资源较多。通常情况下,us+sy 的参考值为 80%,如果其值大于 80%,则表明可能存在 CPU 资源不足的情况。
总的来说,vmstat 命令的输出结果中,我们应该重点注意 procs 项中 r 列的值,以及 CPU 项中 us 列、sy 列和 id 列的值。
3.7.2 vmstat命令格式二
vmstat [选项]... 复制代码
常用选项:
选项 | 含义 |
-f | 显示从启动到目前为止,系统复制(fork)的程序数。此信息是从 /proc/stat 中的 processes 字段中取得的。 |
-s | 将从启动到目前为止,由一些事件导致的内存变化情况列表说明。这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。 |
-S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
-d | 列出硬盘有关读写总量的统计表。 |
-p 分区设备文件名 | 查看硬盘分区的读写情况。 |
示例:
1)-f,显示从启动到目前为止,系统共fork(派生)的程序数。
[root@localhost ~]# vmstat -f //显示从启动到目前为止,系统共派生的程序数 54540 forks 复制代码
2)-S 单位,令输出的数据按指定单位显示。k/K,以KB为单位;m/M,以MB为单位。
[root@localhost ~]# vmstat -S k //令输出的内容以KB为单位 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 1256337 2387 382066 0 0 88 9 217 224 4 6 89 0 0 [root@localhost ~]# vmstat -S m //令输出的内容以MB为单位 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 1255 2 382 0 0 87 9 217 224 4 6 89 0 0 复制代码
3)-d,列出硬盘有关读写总量的统计表。
[root@localhost ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sda 9849 23 738172 136120 4940 155 72326 6248 0 62 sdb 739 0 19241 7312 8 0 8192 1973 0 4 sdc 400 0 8025 2046 4 0 4096 1374 0 2 sr0 18 0 2056 461 0 0 0 0 0 0 dm-0 9342 0 668005 132045 5091 0 68230 4148 0 61 dm-1 94 0 4456 29 0 0 0 0 0 0 dm-2 145 0 2433 1912 4 0 4096 1374 0 2 复制代码
4) -s,显示内存相关统计信息及多种系统活动数量。
[root@localhost ~]# vmstat -s 1867024 K total memory 302616 K used memory 245500 K active memory 250252 K inactive memory 1149732 K free memory 2332 K buffer memory 412344 K swap cache 4194300 K total swap 0 K used swap 4194300 K free swap 19190 non-nice user cpu ticks 41 nice user cpu ticks 28128 system cpu ticks 388810 idle cpu ticks 1790 IO-wait cpu ticks 0 IRQ cpu ticks 341 softirq cpu ticks 0 stolen cpu ticks 383747 pages paged in 44308 pages paged out 0 pages swapped in 0 pages swapped out 982034 interrupts 1003112 CPU context switches 1646377828 boot time 73210 forks 复制代码
5)-p 分区设备文件名,查看硬盘分区的读写情况。
[root@localhost ~]# vmstat -p /dev/sdb1 //查看/dev/sdb1的读写情况 sdb1 reads read sectors writes requested writes 312 5249 4 4096 复制代码
4 启动进程
4.1 手工启动
- 前台启动:用户输入命令,直接执行程序。
- 后台启动:在命令行尾加入“&”符号。
使用sleep命令来观察前台启动与后台启动的区别。
1)"sleep 600"让系统睡眠600秒,在前台运行。
那么进程会占用终端,在进程结束前无法执行其他命令。必须等待进程结束。
2)"sleep 700 &"让系统睡眠700秒,在后台运行。可以看到后台任务序号和PID。
进程不会占用终端,终端可以正常执行其他命令。使用ps命令可以查询到该进程。
4.2 调度启动
- 使用at命令,设置一次性计划任务。
- 使用crontab命令,设置周期性计划任务。
调度启动在下文 ” 8 计划任务管理 “ 中详细介绍。
5 进程的前后台调度(作业控制)
命令介绍:
& //在命令行尾加入“&”符号,把命令放到后台执行。 Ctrl+Z 组合键 //将当前进程挂起,即调入后台并停止执行。 jobs //查看处于后台的任务列表。 fg 任务序号 //将后台进程恢复到前台运行,可指定任务序号。 bg 任务序号 //将一个在后台暂停的任务,变成继续执行。 复制代码
示例:
1)在命令行尾加入“&”符号,输出的信息包括后台任务序号和PID号。
[root@localhost data]# sleep 700 & //将进程放到后台运行 [1] 73216 复制代码
2)Ctrl+Z 组合,可以将当前进程挂起(即调入后台并停止执行)。
[root@localhost ~]# dd if=/dev/zero of=/tmp/test/bigfile bs=1G count=20 ^Z [1]+ 已停止 dd if=/dev/zero of=/tmp/test/bigfile bs=1G count=20 复制代码
3)jobs 命令,查看处于后台的任务列表。
[root@localhost ~]# jobs //查看后台任务列表 [1]+ 已停止 dd if=/dev/zero of=/tmp/test/bigfile bs=1G count=20 复制代码
4)fg 任务序号,将后台进程恢复到前台运行。
[root@localhost ~]# jobs [1]+ 已停止 dd if=/dev/zero of=/tmp/test/bigfile bs=1G count=20 [root@localhost ~]# fg 1 //将1号任务恢复到前台运行,运行过程中会占用终端 dd if=/dev/zero of=/tmp/test/bigfile bs=1G count=20 dd: warning: partial read (884142080 bytes); suggest iflag=fullblock dd: 写入"/tmp/test/bigfile" 出错: 设备上没有空间 记录了5+1 的读入 记录了4+1 的写出 5538648064字节(5.5 GB)已复制,150.624 秒,36.8 MB/秒 复制代码