Linux系统中的基本运行单位是进程,通过对系统系统中的进程的管理能够对系统的实时运行状态进行了解和调度。Linux中提供了用于查看、调整和停止进程的命令。本文仍然以RHEL6说明Linux系统的进程管理。
一、进程概述
程序是保存在存储介质中的可执行机器代码(或指令)和数据的集合,而进程是在计算机处理器执行中的计算机程序。他们的关系如下:
- 程序是保存在外部存储介质中的可执行代码和数据,是静态保存的代码。
- 进程是程序代码在处理器中的运行,是动态执行的代码。
- 操作系统在执行程序时,将代码有外部存储介质(硬盘)读取到内部存储介质(内存)中,驻留在内存中的程序代码作为进程在CPU中被动态执行。
- Linux是多进程操作系统,每个程序启动时可以创建多个进程,与其他程序创建的进程共同运行在Linux内核空间。每个进程都是一个独立的任务,它们一招操作系统内核制定的规则交替被CPU执行。每个单独的进程运行在自己的虚拟地址空间,并且只能通过安全的内核管理机制与其他进程进行交互。
在进程的生存期内将使用许多系统资源,它将使用CPU来运行指令,使用物理内存来保存执行代码和数据,它将打开和使用文件子系统中的文件,并直接或间接地使用系统中的物理设备。
二、查看进程
1、使用ps命令
常用参数:
a 显示所有用户的所有进程(包括其它用户);
u 按用户名和启动时间的顺序来显示进程;
x 显示无控制终端的进程;
e 显示所有进程,包括没有控制端的进程;
f 用树形格式来显示进程;
l 长格式输出;
w 为了避免详细参数被截断,可以用多个w来让其显示完整(比如说ww或者是www);
o 需要查看的选项
举例说明:
[root@Vtest ~]# ps aux|more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.2 2864 1396 ? Ss 13:30 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 13:30 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 13:30 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S 13:30 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S 13:30 0:00 [migration/0] root 6 0.0 0.0 0 0 ? S 13:30 0:00 [watchdog/0] root 7 0.0 0.0 0 0 ? S 13:30 0:00 [events/0] root 8 0.0 0.0 0 0 ? S 13:30 0:00 [cpuset]
ps命令输出中包含的信息:
USER:进程的属主; PID :进程的ID; PPID :父进程; %CPU :进程占用的CPU百分比; %MEM :占用内存的百分比; NI :进程的NICE值,也就是进程的优先值(-20~19之间),数值越大,优先级越底; VSZ :进程虚拟大小; RS :驻留中页的数量; TTY :终端ID。问号表示是无终端的,也就是系统本身。 STAT :进程状态 D Uninterruptible sleep (usually IO) R 正在运行可中在队列中可过行的; S 处于休眠状态; T 停止或被追踪; W 进入内存交换(从内核2.6开始无效); X 死掉的进程(从来没见过); Z 僵尸进程; <</strong> 优先级高的进程 N 优先级较低的进程 L 有些页被锁进内存; s 进程的领导者(在它之下有子进程); l 多线程 (using CLONE_THREAD, like NPTL pthreads do) + 位于后台的进程组; WCHAN :正在等待的进程资源; START : 启动进程的时间; TIME : 进程消耗CPU的时间; COMMAND: 启动进程的命令的名称和参数;
ps命令的其他用法:
(1)
[root@Vtest ~]# ps aux |grep httpd ###查看httpd程序的进程
root 1879 0.0 1.6 33096 8548 ? Ss 13:31 0:00 /usr/sbin/httpd apache 1887 0.0 0.8 33096 4212 ? S 13:31 0:00 /usr/sbin/httpd
(2)
[root@Vtest ~]# ps axo pid,%cpu,%mem,comm |grep httpd ##只查看pid,%cpu,%mem,comm这几项
1879 0.0 1.6 httpd 1887 0.0 0.8 httpd 1888 0.0 0.8 httpd
至于其他的参数,大家可以自行练习一下。
Tips:什么是僵尸进程。通常,造成僵尸进程的成因是因为该进程应该已经执行完毕,或者是因故应该要终止了, 但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中。如果你发现在某个进程的 CMD 后面还接上 时,就代表该进程是僵尸进程。当系统不稳定的时候就容易造成所谓的僵尸进程。也有可能是因为程序写的不完善,或者是使用者的操作习惯不良等等所造成。如果你发现系统中很多僵尸进程时,记得要找出该进程的父进程,然后做个跟踪排除问题!
2、top命令
top命令会在当前终端全屏显示系统运行信息,实时跟踪系统资源的使用情况,显示内容包括CPU、内存占用情况,系统运行进程的列表和每一个进程运行的状态等信息,对于分析系统运行中的问题很有帮助。
[root@Vtest ~]# top
以下是top某一刻的输出信息:
- top - 14:01:40 up 31 min, 1 user, load average: 0.04, 0.01, 0.00
- Tasks: 122 total, 1 running, 121 sleeping, 0 stopped, 0 zombie
- Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
- Mem: 511140k total, 283656k used, 227484k free, 24136k buffers
- Swap: 2064376k total, 0k used, 2064376k free, 148144k cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 2215 root 20 0 2672 1116 880 R 0.7 0.2 0:00.08 top
- 2145 root 20 0 11552 3316 2580 S 0.3 0.6 0:00.25 sshd
- 1 root 20 0 2864 1396 1184 S 0.0 0.3 0:01.67 init
- 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
- 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
- 4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
- 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
- 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
- 7 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/0
- 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuset
- 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
- 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
- 11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
- 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
- 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 sync_supers
- 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
- 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0
- 16 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kblockd/0
- 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpid
- 18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify
- 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_hotplug
- 20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata/0
- 21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux
- 22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd
- 23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
我们把输出信息划分为三部分:
1-5行为第一部分:
第1行:
top - 14:01:40 : 当前时间,默认每三秒更新一次。
up 31 min :系统运行了多长时间,格式为时:分
1 user :当前登录用户数
load average: 0.00, 0.00, 0.00 : 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
第2行:
Tasks: 122 total :系统总的进程数
1 running :正在运行的进程数
121 sleeping:休眠状态的进程数
0 stopped :停止的进程数
0 zombie :僵尸进程数
第3行:
Cpu(s): 0.0%us (user mode)用户所占用CPU百分比
0.3%sy (system mode)内核所占用CPU百分比
0.0%ni (nice)用户进程内改变过优先级的进程占用CPU百分比
99.3%id (idle task) 空闲CPU百分比
0.0%wa (I/O waiting)等待输入输出的CPU时间百分比(I/O 产生的问题,会严重的影响您的服务器性能,因为I/O是消耗CPU的)
0.0%hi (servicing IRQs)
0.3%si (servicing soft IRQs)
0.0%st (steal (time given to other DomU instances))
第4行:
Mem: 511140k total:物理内存总量
283656k used :已使用的物理内存
227484k free :未使用的物理内存
24136k buffers :内核缓存占用的物理内存
第5行:
Swap: 2064376k total :交换分区总容量
0k used:已使用的交换分区容量
2064376k free:未使用的交换分区容量
148144k cached :缓存的总容量,如果存在未使用的物理内存,则cached占用的是物理内存,如果未使用的物理内存为0,则cached将会占用部分swap分区,那么cached的容量是它占用的物理内存部分加上占用的swap分区的部分。
第6行为第二部分:
此为top的内部命令输入部分,常用命令有:
s 改变top命令的刷新频率(默认是3秒),Change delay from 3.0 to:输入相应的数字
l 关闭或开启第一行 top 信息
t 关闭或开启第二行 Tasks 和第三行 Cpus 信息
m 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息
N 以 PID 的大小的顺序排列表示进程列表
P 以 CPU 占用率大小的顺序排列进程列表
M 以内存占用率大小的顺序排列进程列表
R 对排列进行反转
u 显示指定用户的进程,默认是全部用户的进程
c 显示进程的全路径,默认是只有进程名
n 或者 # 设置在进程列表所显示进程的数量,但最多是显示满屏
f 调整top命令显示列表项。如增加GROUP列或UID列等等。但在下次使用top命令,还是原来成默认的。
k 结束进程
r 调整进程的优先级(Linux和AIX是从-20到19,HP-UX为0到39),至于如何得到的,可以通过man nice来查看。
h 显示帮助
q 退出 top
其余部分为进程信息:
top进程信息列表中各列的含义:
PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级(Linux和AIX是从-20到19,HP-UX为0到39)
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数
S 进程状态
D=不可中断的睡眠状态
R=运行
S=休眠
T=跟踪/停止
Z=僵尸进程
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志
默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过我们上面所说的内部的f命令,来调整列表选项。