计算机存在的目的就是为了运行各种各样的程序,迄今我们介绍的绝大多数命令,都是为了完成某种计算而用编程语言编写的程序,它们以文件的形式保存在操作系统之中 (比如 /bin 下的各种命令);但静态的程序并不能“自发的” 产生结果,只有在操作系统中为其指定输入数据并运行起来,才能得到输出结果。而操作系统中程序运行的最主要表现形式便是进程。
静态程序可以长久的存在,动态的进程具有有限的生命周期。每次程序运行的开始 (如键入一条命令后按下回车键),操作系统都要为程序的运行准备各种资源,这些资源绝大多数都处于内存之中。为了限制多用户进程的权限,linux 还定义了两种进程运行时态:内核态和用户态;当进程想要请求系统服务时(比如操作一个物理设备),必须通过系统调用(操作系统提供给用户空间的接口函数) 来实现,此时系统切换到内核态,代表程序执行该系统调用,执行完毕后系统切换回用户态,继续执行程序代码。
本文介绍 linux 中关于进程与内存的管理命令 (更多的是查看命令)
1、uptime 系统运行时间
|
|
单独执行此命令时,输出信息表示:当前时间,系统运行时长,登录用户个数,系统过去 1、5、15 分钟内的平均负载。
|
|
2、ps 显示系统进程信息
|
|
单独运行 ps 命令时显示信息为:进程 ID 号 (PID)、终端 (TTY)、运行累积 CPU 时长 (TIME)、命令名 (CMD)
|
|
这里简要叙述一下关于进程、进程组、会话和终端的关系。linux 操作系统为了方便管理进程,将功能相近或存在父子、兄弟关系的进程归为一组,每个进程必定属于一个进程组,也只能属于一个进程组。一个进程除了有进程 ID 外,还有一个进程组 ID(PGID);每个进程组都有一个进程组组长,它的 PID 和进程组 ID 相同。像一系列相关进程可以合并为进程组一样,一系列进程组也可以合并成一个会话 session。会话是由其中的进程建立的,该进程叫做会话的首进程 (session leader)。会话首进程的 PID 即为此会话的 SID(session ID)。每个会话都起始于用户登录,终止于用户退出。会话中的每个进程组称为一个工作(job)。会话可以有一个进程组成为会话的前台工作(foreground),而其他的进程组是后台工作(background)。每个会话都关联到一个控制终端 control terminal,当会话终止时(用户退出终端),系统会发送终止信号(SIGHUP) 给会话中的所有进程组,进程对此信号的默认处理方式为终止进程。
ps 接受三种格式的选项,带前缀符号 - 的 UNIX 格式的选项;不带前缀的 BSD 风格的选项;带两个 - 的 GNU 长格式选项。三种类型的选项可以自由组合,但可能会出现冲突。
选项 a(BSD) 表示显示所有和终端关联的进程信息,当配合选项 x(BSD) 一起使用时表示显示所有进程信息 (此时终端无关的进程 TTY 列显示为?)。
选项 -a(UNIX) 表示显示与终端关联的除了会话首进程之外的进程信息。选项 -e 表示所有进程。
|
|
如例子中所示,BSD 风格的选项还会显示进程的状态信息以及命令的参数。进程在运行的过程当中可能处于的状态包括:
- D 不可中断的睡眠状态 (通常在等待 IO)
- R 正在运行或可以运行 (在运行队列中)
- S 可中断的睡眠状态 (等待一个事件完成)
- T 暂停状态
- t 跟踪状态
- W 换页状态 (2.6 内核以后版本)
- X 死亡状态 (不可见)
- Z 僵死状态
BSD 风格的选项 STAT 列还可能包括以下字符
- < 高优先级进程
- N 低优先级进程
- L 锁定状态
- s 会话首进程
- l 多线程进程
- 进程处于前台进程组
选项 u 显示用户导向的进程信息 (如进程的发起用户,用户态占用 CPU 和 MEM 百分比等)
|
|
VSZ 表示占用的总的地址空间大小。它包括了没有映射到内存中的页面。
RSS 表示实际驻留 “在内存中” 的内存大小,不包括交换出去的内存。和 VSZ 的单位均为 KB
通常查看所有进程信息会使用命令 ps -ef 或 ps aux
选项 -o 或 o 表示指定输出格式
如显示所有 bash 进程的 pid,命令名,运行于哪颗逻辑 cpu:
|
|
配合选项 –sort 可指定按某一列排序输出
|
|
还可以用 -o 指定许多其他信息,请查询相关手册。
3、kill 终止进程
|
|
命令 kill 会发送特定的信号给指定的进程或进程组,如果没有指定信号,则发送 TERM 信号
选项 -l 表示列出所有支持的信号:
|
|
可以使用选项 -s 指定要发送的信号
如在一个终端启动进程 sleep 300,在另一个终端查看并使用信号 SIGKILL 将其终止:
|
|
或者执行命令 kill -9 10359 是同样的效果。关于其他信号的作用,请自行搜索。
4、pgrep 和 pkill 搜索或者发送信号给进程
|
|
这里的 pattern 是正则表达式,用来匹配进程名
如查看名称为 gunicorn 的所有进程
|
|
选项 -l 显示进程名和 pid
|
|
如终止所有 sleep 进程
|
|
如使 syslogd 重读它的配置文件
|
|
5、top 显示进程信息
top 命令实时动态的显示系统汇总信息和进程状态信息,它每隔 1s 刷新一次,按键盘 q 键退出。
单独执行 top 命令时显示如下输出:
|
|
下面分别对每行输出内容进行解释 (注:top 版本为 3.3.10,其他版本的输出第四行和第五行可能不同)
- 第一行显示信息和命令 uptime 的输出一致;
- 第二行显示任务汇总信息,状态即为进程可能状态中的四种;
- 第三行显示 cpu 负载信息,其中 us 表示用户态任务占用 CPU 时间百分比,sy 表示内核态任务占用 CPU 时间百分比,ni 表示改变过进程优先级的进程 (通过 nice 或 renice 命令) 占用 CPU 时间百分比,id 表示 CPU 空闲时间百分比,wa 表示等待输入输出的进程占用 CPU 时间百分比,hi 表示硬件中断花费时间,si 表示软件中断花费时间,st 表示虚拟机等待真实物理机 CPU 资源的时间
- 第四行显示内存信息,total 表示总内存,free 表示未分配内存,used 表示使用的内存 (值为 total-free-buff/cache 的结果),buff/cache 表示缓存内存;
- 第五行显示交换分区使用量,其中 avail Mem 表示启动一个新程序时可以分配给它的最大内存,和第三行 free 列不同的地方在于,它会统计可以被回收的缓存分配器 (slab) 和页高速缓冲存储器 (page cache) 中的内存。(在一些较早的 top 实现中,并没有这一列的值)
接下来经过一个空行之后,显示的是进程相关信息,表头各列字段和 ps 命令的输出均有相对应的关系,其中 PR 表示优先级;NI 表示 nice 值 (后述);VIRT 表示虚拟内存大小,对应 ps 命令中的 VSZ;RES 表示进程常驻内存大小,对应 ps 命令中的 RSS;SHR 表示共享内存大小;S 表示进程状态,对应 ps 命令的 STAT;
linux 系统的进程状态中有一个优先级 (priority) 的概念,其值是一个动态变化的整数,范围是 0-139,此值越小,则优先级越高,那么它就越优先被 CPU 执行。如果 top 命令 PR 列显示为 rt,表示此进程为实时进程,它的优先级范围是 0-99,比其他的普通进程都要高。linux 中还有静态优先级的概念,用户可以通过使用命令 nice 和 renice 对进程设置或改变静态优先级,它可以看成是动态优先级的修正值,能够影响动态优先级的值。
PR 列显示的值为实际优先级减去实时进程最大优先级之后的值,3.10 内核非实时进程的默认值为 20,即:DEFAULT_PRIO = MAX_RT_PRIO + 20 = 120
NI 列不为 0 时,表示进程被设置过静态优先级值,范围是 -20 到 19,它与当前优先级值的关系是:DEFAULT_PRIO = MAX_RT_PRIO + (nice) + 20
如使用 nice 启动一个 sleep 进程:
|
|
上例中使用了选项 -n 表示 top 刷新次数,-b 表示批处理模式运行 top,此模式会去掉输出中的控制字符,方便将输出交给其他程序处理。
选项 -o fieldname 按指定列排序输出,选项 -O 可以列出 -o 能够指定的列名
|
|
下面简要介绍一些 top 中可以使用的交互命令:
- q 退出 top
- h 获得帮助信息
- 1 显示每个逻辑 cpu 的信息
- k 终止一个进程 (会提示用户输入需要终止的 pid,以及需要发送什么样的信号)
- r 重新设置进程静态优先级 (相当于执行 renice)
- i 忽略闲置和僵死进程
- H 显示线程信息
- M 根据驻留内存大小排序
- P 根据 CPU 使用百分比排序
- W 将当前设置写入~/.toprc 文件中
6、free 显示系统内存使用情况
|
|
free 命令显示系统当前内存、swap(交换分区) 的使用情况,默认单位是 KB
|
|
显示信息和 top 命令输出中的对应值一致,其中 shared 表示内存文件系统 (tmpfs) 中使用内存的大小。
前面讲述了 available 对应值所表示的含义,通常查看系统当前还有多少可用内存,看 available 的对应值就可以了。这里 available = free + 缓存 (可被回收部分)。
但在较老版本的 free 中并没有这个值,它的输出可能是这样的:
|
|
说明:
- buffer(缓冲) 是为了提高内存和硬盘 (或其他 I/O 设备) 之间的数据交换的速度而设计的
- cache(缓存) 是为了提高 cpu 和内存之间的数据交换速度而设计的
所以输出中 buffers 可简单理解为准备写入硬盘的缓冲数据;cached 可理解为从硬盘中读出的缓存数据 (页高速缓冲存储器),缓存中可被回收部分来自 cached 和 slab(缓存分配器)
- Mem 行:used = total - free 此时的空闲内存 free 列并不能体现系统当前可用内存大小
-/+ buffers/cache 行:used = total - free(Mem) - (buffers + cached),这里的 free 列和前面所述的 available 关系为 available = free + 缓存 (可被回收部分)
所以当没有 available 列可查看时,并不能通过 free 命令查到或计算出真正可用内存,需要知道缓存部分的具体情况。
选项 -b、-k、-m、-g 分别表示指定各值的单位:bytes, KB, MB, 或者 GB
7、fuser 使用文件或套接字定位进程
fuser 经常用来查看文件被哪些进程所使用
|
|
例子表示显示有三个进程在使用当前目录,其中:2528c 前面数字表示进程 PID,后面的字符 c 表示当前目录 (即进程在此目录下工作),还可能出现的字符有:
- e 表示进程正在运行执行文件
- f 打开文件,默认输出时省略
- F 写方式打开文件,默认时输出省略
- r 根目录
- m mmap 文件或共享库文件
- 选项 -k 表示发送信号 SIGKILL 给相关进程 (谨慎使用)
- 选项 -i 表示交互,在 kill 一个进程之前询问用户
- 选项 -l 列出支持的信号
- 选项 -SIGNAL 指定信号
8、lsof 列出打开文件
在这一篇中我们简单描述了 bash 进程打开的前三个文件,并分别关联到文件描述符 0,1,2。对于其他进程打开的文件也是同样,系统为每个进程维护一个文件描述符表,该表的值都是从 0 开始的数字。单独执行 lsof 命令时会显示系统中所有进程打开的文件
|
|
每行一个打开的文件,表头各列意为:
|
|
- 选项 -n 表示不做 ip 到主机名的转换
- 选项 -c string 显示 COMMAND 列中包含指定字符的进程所有打开的文件
- 选项 -u username 显示所属 user 进程打开的文件
- 选项 -d FD 显示打开的文件描述符为 FD 的文件
|
|
- 选项 +d DIR 显示目录中被进程打开的文件
- 选项 +D DIR 递归显示目录中被进程打开的文件
|
|
选项 -i 表示显示符合条件的进程打开的文件,格式为 [46][protocol][@hostname|hostaddr][:service|port]
|
|
试想,如果删除了一个正在被其他进程打开的文件会怎样?实验来看看现象:
|
|
linux 系统中 /proc 目录保存了系统所有进程相关的数据,里面的数字目录名即为 PID。我们进一步来看一下刚才的 more 进程的文件描述符
|
|
结论就是,如果在删除文件的时候有进程正在打开该文件,那么该文件的内容还是可以通过进程的对应文件描述符恢复的。同时,如果删除了某文件,发现空间并没有释放,说明有进程正在打开该文件 (命令 lsof|grep delete
查看),重新启动该进程之后,空间就会得到释放。
9、iostat 显示 CPU、I/O 统计信息
|
|
显示信息中 cpu 部分在命令 top 的描述中都有相应的解释,I/O 部分是各个设备读写速率及总量信息,其中 tps 表示每秒多少次 I/O 请求
- 选项 -c 显示 CPU 信息
- 选项 -d 显示设备信息
- 选项 -x 显示更详细的信息
命令 iostat m n 数字 (m,n),m 表示时间间隔,n 表示次数;此时 iostat 会每隔 m 秒打印一次,打印 n 次。
|
|
10、vmstat 显示虚拟内存统计信息
|
|
同样也会显示一些 CPU 和 I/O 的信息
选项 -w 格式化输出
|
|
其中
|
|
- 选项 -m 显示 slab 信息
- 选项 -s 显示各种内存计数器及其信息
- 选项 -d 显示磁盘 I/O 信息
- 选项 -p device 显示设备分区详细 I/O 信息
同 iostat 一样也支持按频率打印次数
11、mpstat 显示 CPU 相关信息
|
|
显示信息和 top 命令相似
|
|
- 选项
-A
显示所有 CPU 及中断信息相当于执行mpstat -I ALL -P ALL
- 选项
-I {SUM | CPU | SCPU | ALL}
显示中断信息 - 选项
-P {cpu [,...] | ON | ALL }
显示 CPU 信息
|
|
本文简单介绍了linux中进程和内存的相关命令,进程和内存在计算机操作系统中非常重要,涉及到的内容也非常多,这里就不做展开了。