进程概念
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
Process(进程):运行中的程序的一个副本,是被载入内存的一个指令集合
进程ID (Process ID ,PID )号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限
通常从执行进程的用户来继承
存在生命周期
task struct :Linux 内核存储进程信息的数据结构格式
task list :多个任务的的task struct 组成的链表
进程创建:
init :第一个进程
父子关系
进程:都由其父进程创建,CoW
fork(), clone()
进程优先级
系统优先级: 数字越小,优先级越高
0-139 (CentOS4,5)
各有140 个运行队列和过期队列
0-98 ,99 (CentOS6)
实时优先级: 99-0 :值最大优先级最高
nice值:-20到19,对应 系统优先级100-139 或99
Big O :时间复杂度,用时和规模的关系
O(1), O(logn), O(n) 线性, O(n^2) 抛物线, O(2^n)
进程相关概念
进程内存:
Page Frame: 页框,用存储页面数据,存储Page 4k
LRU:Least Recently Used 近期最少使用算法, 释放内存物理地址空间和线性地址空间
MMU:Memory Management Unit 负责转换线性和物理地址
TLB:Translation Lookaside Buffer 翻译后备缓冲器, 用于保存虚拟地址和物理地址映射关系的缓存
IPC: Inter Process Communication
同一主机: signal: 信号
shm: shared memory
semaphore: 信号量,一种计数器
不同主机:rpc: remote procedure call
socket: IP和端口号
LRU算法
假设序列为 4 3 4 2 3 1 4 2
物理块有3个,则第1轮 4调入内存 4,第2轮 3调入内存 3 4,第3轮 4调入内存 4 3,第4轮 2调入内存 2 4 3,第5轮 3调入内存 3 2 4, 第6轮 1调入内存 1 3 2, 第7轮 4调入内存 4 1 3,第8轮 2调入内存 2 4 1
进程状态
Linux 内核:抢占式多任务
进程类型:
守护进程: daemon, 在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
进程状态:
运行态:running
就绪态:ready
睡眠态:可中断:interruptable
不可中断:uninterruptable
停止态:stopped, 暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
系统管理工具
进程的分类:
CPU-Bound :CPU 密集型,非交互
IO-Bound :IO 密集型,交互
Linux 系统状态的查看及管理工具:pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat,dstat, kill,pkill, job, bg, fg, nohup
pstree 命令:
pstree – display a tree of processes 显示进程树
ps: process state 进程状态
ps – report a snapshot of the current processes 报告当前进程
Linux系统各进程的相关信息均保存在/proc/PID 目录下的各文件中
[root@localhost ~]# pstree init─┬─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─automount───4*[{automount}] ├─bonobo-activati───{bonobo-activat} ├─certmonger ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─cupsd ├─2*[dbus-daemon───{dbus-daemon}]
进程ps
适用ps 来查看进程信息
ps [OPTION]…
[root@localhost ~]# ps PID TTY TIME CMD 2389 pts/0 00:00:00 bash 2410 pts/0 00:00:00 ps
支持三种选项:
UNIX 选项如-A -e
BSD 选项如a
GUN 选项如–help
默认显示当前终端中的进程
a 选项包括所有终端中的进程
[root@localhost ~]# ps a PID TTY STAT TIME COMMAND 2175 tty2 Ss+ 0:00 /sbin/mingetty /dev/tty2 2177 tty3 Ss+ 0:00 /sbin/mingetty /dev/tty3 2179 tty4 Ss+ 0:00 /sbin/mingetty /dev/tty4 2182 tty5 Ss+ 0:00 /sbin/mingetty /dev/tty5 2184 tty6 Ss+ 0:00 /sbin/mingetty /dev/tty6 2226 tty1 Ssl+ 0:00 /usr/bin/Xorg :0 -br -verbose -audit 4 -auth /var/run/ 2389 pts/0 Ss 0:00 -bash 2409 pts/0 R+ 0:00 ps a
x 选项包括不链接终端的进程
[root@localhost ~]# ps x PID TTY STAT TIME COMMAND 1 ? Ss 0:01 /sbin/init 2 ? S 0:00 [kthreadd] 3 ? S 0:00 [migration/0] 4 ? S 0:00 [ksoftirqd/0] 5 ? S 0:00 [stopper/0] 6 ? S 0:00 [watchdog/0]
u 选项显示进程所有者的信息
[root@localhost ~]# ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2175 0.0 0.0 4064 540 tty2 Ss+ May07 0:00 /sbin/mingetty / root 2177 0.0 0.0 4064 540 tty3 Ss+ May07 0:00 /sbin/mingetty / root 2179 0.0 0.0 4064 544 tty4 Ss+ May07 0:00 /sbin/mingetty / root 2182 0.0 0.0 4064 540 tty5 Ss+ May07 0:00 /sbin/mingetty / root 2184 0.0 0.0 4064 536 tty6 Ss+ May07 0:00 /sbin/mingetty / root 2226 0.0 1.1 207056 21528 tty1 Ssl+ May07 0:01 /usr/bin/Xorg :0 root 6750 0.0 0.0 108484 1860 pts/0 Ss 08:03 0:00 -bash root 6799 0.0 0.0 110244 1148 pts/0 R+ 08:11 0:00 ps u
f 选项显示进程的父进程
[root@localhost ~]# ps f PID TTY STAT TIME COMMAND 6750 pts/0 Ss 0:00 -bash 6801 pts/0 R+ 0:00 \_ ps f 2226 tty1 Ssl+ 0:01 /usr/bin/Xorg :0 -br -verbose -audit 4 -auth /var/run/ 2184 tty6 Ss+ 0:00 /sbin/mingetty /dev/tty6 2182 tty5 Ss+ 0:00 /sbin/mingetty /dev/tty5 2179 tty4 Ss+ 0:00 /sbin/mingetty /dev/tty4 2177 tty3 Ss+ 0:00 /sbin/mingetty /dev/tty3 2175 tty2 Ss+ 0:00 /sbin/mingetty /dev/tty2
o 属性… 选项显示定制的信息:pid、comm、%cpu、%mem、state、tty、euser、ruser
[root@localhost ~]# ps axo pid,%cpu,cmd PIDpid,COMMAND pu,cmd 1pid,init pu,cmd 2pid,kthreadd pu,cmd 3pid,migration/0 pu,cmd 4pid,ksoftirqd/0 pu,cmd 5pid,stopper/0 pu,cmd 6pid,watchdog/0 pu,cmd 7pid,migration/1 pu,cmd
进程管理工具
VSZ: Virtual memory SiZe ,虚拟内存集,线性内存
RSS: ReSident Size, 常驻内存集
STAT:进程状态
R:running 运行
S: interruptable sleeping 可中断休眠
D: uninterruptable sleeping 不可中断休眠
T: stopped 休眠状态
Z: zombie 僵尸状态
+:前台进程
l:多线程进程
L:内存分页并带锁
N:低优先级进程
<:高优先级进程
s: session leader,会话(子进程)发起者
[root@localhost ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 19348 1544 ? Ss May07 0:01 /sbin/init root 21 0.0 0.0 0 0 ? R May07 0:01 [events/2] root 74 0.0 0.0 0 0 ? SN May07 0:00 [ksmd] root 1664 0.0 0.0 27596 848 ? S<sl May07 0:00 auditd root 2175 0.0 0.0 4064 540 tty2 Ss+ May07 0:00 /sbin/mingetty /
常用组合:-ef
-e:显示所有进程
-f:显示完整格式程序信息
[root@localhost ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 May07 ? 00:00:01 /sbin/init root 2 0 0 May07 ? 00:00:00 [kthreadd] root 3 2 0 May07 ? 00:00:00 [migration/0] root 4 2 0 May07 ? 00:00:00 [ksoftirqd/0] root 5 2 0 May07 ? 00:00:00 [stopper/0] root 6 2 0 May07 ? 00:00:00 [watchdog/0]
常用组合:-eFH
-F:显示更完整格式的进程信息
-H:以进程层级格式显示进程相关信息
[root@localhost ~]# ps -eFH UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 1 0 0 4837 1544 0 May07 ? 00:00:01 /sbin/init root 612 1 0 2819 1396 1 May07 ? 00:00:00 /sbin/udevd -d root 2193 612 0 3129 2844 2 May07 ? 00:00:00 /sbin/udevd -d root 2194 612 0 3129 2844 0 May07 ? 00:00:00 /sbin/udevd -d root 1602 1 0 2280 1052 3 May07 ? 00:00:00 /sbin/dhclient -H localh root 1664 1 0 6899 848 2 May07 ? 00:00:00 auditd root 1698 1 0 62288 1696 0 May07 ? 00:00:00 /sbin/rsyslogd -i /var/r
常用组合:自定义
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ni:nice值
pri: priority优先级
psr: processor CPU编号
rtprio:实时优先级
示例:
ps axo pid,cmd,psr,ni,pri,rtprio
[root@localhost ~]# ps xao pid,cmd,ni,rtprio,pri PID CMD NI RTPRIO PRI 1 /sbin/init 0 - 19 2 [kthreadd] 0 - 19 3 [migration/0] - 99 139 4 [ksoftirqd/0] 0 - 19 5 [stopper/0] - 99 139 6 [watchdog/0] - 99 139
进程优先级
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
nice命令:
nice [OPTION] [COMMAND [ARG]…]
查看:
ps axo pid,comm,ni
[root@localhost ~]# ps xao pid,cmd,ni,rtprio,pri 2505 watch -n 1 free -m 0 - 19 [root@localhost ~]# nice -n 10 watch -n 1 free -m [root@localhost ~]# ps xao pid,cmd,ni,rtprio,pri 2615 watch -n 1 free -m 10 - 9 renice 命令: renice [-n] priority pid... [root@localhost ~]# ps xao pid,cmd,ni,rtprio,pri 2615 watch -n 1 free -m 10 - 9 [root@localhost ~]# renice -n 0 2615 2615: old priority 1, new priority 0 [root@localhost ~]# ps xao pid,cmd,ni,rtprio,pri 2615 watch -n 1 free -m 0 - 19
搜索进程
最灵活:ps选项 | 其它命令
按预定义的模式:pgrep
pgrep [options] pattern
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l:显示进程名
-a:显示完整格式的进程名
-P pid:显示指定进程的子进程
按确切的程序名称:/sbin/pidof
pidof bash
[root@localhost ~]# ps aux | grep '\<dd\>' root 3718 99.7 0.0 105184 660 pts/1 R+ 23:48 1:06 dd if=/dev/zero of=/dev/null [root@localhost ~]# pgrep -t pts/1 -l 2483 bash 2505 watch 3718 dd
系统工具
uptime
显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)
[root@localhost ~]# uptime 00:32:28 up 1:30, 2 users, load average: 1.00, 1.00, 0.91
当前时间 启动总时间 用户登录数 平均负载
系统平均负载:
指在特定时间间隔内运行队列中的平均进程数
通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
如果linux 主机是1 个双核CPU,当Load Average 为6的时候说明机器已经被充分使用。
进程管理工具
top:有许多内置命令:
排序:
P:以占据的CPU 百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU 时长,TIME+
首部信息显示:
uptime信息:l 命令
tasks及cpu 信息:t 命令
cpu分别显示:1 ( 数字)
memory 信息:m 命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
top 命令
栏位信息简介
us:用户空间
sy:内核空间
ni:调整nice 时间
id:空闲
wa:等待IO 时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间
[root@localhost ~]# top top - 00:40:20 up 1:38, 2 users, load average: 1.00, 1.00, 0.91 Tasks: 168 total, 2 running, 163 sleeping, 3 stopped, 0 zombie Cpu(s): 4.8%us, 20.2%sy, 0.0%ni, 74.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1906252k total, 366932k used, 1539320k free, 41580k buffers Swap: 2097148k total, 0k used, 2097148k free, 119648k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3718 root 20 0 102m 660 556 R 100.0 0.0 52:21.78 dd 20 root 20 0 0 0 0 S 0.3 0.0 0:02.82 events/1 2401 root 20 0 99.7m 4120 3112 S 0.3 0.2 0:00.67 sshd 3953 root 20 0 15032 1272 936 R 0.3 0.1 0:00.05 top 1 root 20 0 19344 1540 1228 S 0.0 0.1 0:02.35 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.03 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 stopper/0
选项:
-d #:指定刷新时间间隔,默认为3秒
-b:以批次方式
-n #:显示多少批次
htop命令:需从Fedora-EPEL 源安装
http://172.16.0.1/fedora-epel/7/x86_64
选项:
-d #:指定延迟时间;
-u UserName: 仅显示指定用户的进程
-s COLUME: 以指定字段进行排序
子命令:
s:跟踪选定进程的系统调用
l:显示选定进程打开的文件列表
a:将选定的进程绑定至某指定CPU 核心
t:显示进程树
内存工具
vmstat 命令:虚拟内存信息
vmstat [options] [delay [count]]
vmstat 2 5
procs:
r:等待运行的进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
swpd: 交换内存的使用总量
free:空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap:
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率(kb/s)
bo:保存数据至块设备的速率
system:
in: interrupts, 中断速率,包括时钟
cs: context switch,进程切换速率
cpu:
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41 前, 包括IO-wait time.
wa: Time spent waiting for IO. 2.5.41 前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11 前, unknown.
选项:
-s:显示内存的统计数据
iostat: 统计CPU和设备IO信息
示例:iostat 1 10
[root@localhost ~]# iostat 1 Linux 2.6.32-696.el6.x86_64 (localhost.localdomain) 05/09/2017 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 3.39 0.00 13.53 0.46 0.00 82.63 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.96 38.00 3.76 324686 32122 sdb 0.03 0.26 0.00 2256 0 sdc 0.23 0.87 0.00 7469 0 scd0 0.01 0.04 0.00 360 0
pmap 命令:进程对应的内存映射
pmap [options] pid […]
-x: 显示详细格式的信息
示例:pmap 1
[root@localhost ~]# pmap -x 1 1: /sbin/init Address Kbytes RSS Dirty Mode Mapping 00007f8db296f000 52 20 0 r-x-- libnss_files-2.12.so 00007f8db297c000 2044 0 0 ----- libnss_files-2.12.so 00007f8db2b7b000 4 4 4 r---- libnss_files-2.12.so 00007f8db2b7c000 4 4 4 rw--- libnss_files-2.12.so 00007f8db2b7d000 1576 548 0 r-x-- libc-2.12.so 00007f8db2d07000 2048 0 0 ----- libc-2.12.so
另外一种实现:
cat /proc/PID/maps
系统监控工具
glances 命令:EPEL源
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-Ppassword] [–password] [-t refresh] [-f file] [-o output]
内建命令:
a Sort processes automatically 自动排序过程
l Show/hide logs l显示/隐藏日志
c Sort processes by CPU% 按CPU%排序进程
b Bytes or bits for network I/O 用于网络I/O的字节或比特
m Sort processes by MEM% 排序过程
w Delete warning logs 删除警告日志
p Sort processes by name 按名称排序进程
x Delete warning and critical logs 删除警告和关键日志
i Sort processes by I/O rate 按I/O速率排序进程
1 Global CPU or per-CPU stats 全局CPU或每个CPU统计
d Show/hide disk I/O stats 显示/隐藏磁盘I/O统计
h Show/hide this help screen 显示/隐藏此帮助屏幕
f Show/hide file system stats 显示/隐藏文件系统统计
t View network I/O as combination 将网络I/O视为组合
n Show/hide network stats 显示/隐藏网络统计
u View cumulative network I/O 查看累积网络输入输出
s Show/hide sensors stats q 显示/隐藏传感器统计Q
Quit (Esc and Ctrl-C also work) 退出(ESC和Ctrl-C)
y Show/hide hddtemp stats Y 显示/隐藏hddtemp统计
常用选项:
-b:以Byte为单位显示网卡数据速率
-d:关闭磁盘I/O模块
-f /path/to/somefile:设定输入文件位置
-o {HTML|CSV}:输出格式
-m:禁用mount 模块
-n:禁用网络模块
-t #:延迟时间间隔
-1:每个CPU
C/S模式下运行glances 命令
服务器模式:
glances -s -B IPADDR
IPADDR:指明监听的本机哪个地址
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
dstat 命令:系统资源统计, 代替vmstat,iostat
dstat [-afv] [options..] [delay [count]]
-c:显示cpu相关信息
-C #,#,…,total
-d:显示disk 相关信息
-D total,sda,sdb,…
-g:显示page相关统计数据
-m:显示memory相关统计数据
-n:显示network相关统计数据
-p:显示process相关统计数据
-r:显示io请求相关的统计数据
-s:显示swapped
–tcp
–udp
–unix
–raw
–socket
–ipc
–top-cpu:显示最占用CPU 的进程
–top-io:显示最占用io 的进程
–top-mem:显示最占用内存的进程
–top-latency: 显示延迟最大的进程
进程管理工具
kill命令:
向进程发送控制信号,以实现对进程管理, 每个信号对应一个数字,信号名称以SIG 开头(可省略 ),不区分大小写,一般检查一个进程
显示当前系统可用信号:kill –l,trap -l
[root@localhost ~]# pidof ping 6623 [root@localhost ~]# kill -0 6623 [root@localhost ~]# echo $? 0 [root@localhost ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
常用信号:man 7 signal
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
3) SIGQUIT: 相当于ctrl+\
9) SIGKILL: 强制杀死正在运行的进程
15) SIGTERM:终止正在运行的进程
18) SIGCONT:继续运行
19) SIGSTOP:后台休眠
指定信号的方法:
(1)信号的数字标识:1, 2, 9
(2)信号完整名称:SIGHUP
(3)信号的简写名称:HUP
按PID :kill [-SIGNAL] pid …
kill –n SIGNAL pid;kill –s SIGNAL pid
按名称:killall [-SIGNAL] comm…
可杀死多个进程
按模式:pkill [options] pattern
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal:与指定终端相关的进程
-l:显示进程名(pgrep 可用)
-a:显示完整格式的进程名(pgrep 可用)
-P pid:显示指定进程的子进程
作业管理
Linux 的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台
(1)运行中的作业:Ctrl+z
(2)尚未启动的作业:# COMMAND &
如ping 127.0.0.1 &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系
# nohup COMMAND &
#screen;COMMAND
查看所有作业:
# jobs 可查看编号
[1]+ Running ping 127.0.0.1 &
作业控制:
# fg [[%]JOB_NUM] :把指定的后台作业调回前台
如果编号为1,fg 1
# bg [[%]JOB_NUM] :让送往后台的作业在后台继续运行
如果编号为1,bg 1
# kill [%JOB_NUM] :终止指定的作业
如果编号为1,Kill % 1,即可停止
并行运行
同时运行多个进程,提高效率
方法1
vi all.sh
f1.sh&
f2.sh&
f3.sh&
方法2
(f1.sh&);(f2.sh&);(f3.sh&)
方法3
{ f1.sh& f2.sh& f3.sh& }
原创文章,作者:Linux.rookie,如若转载,请注明出处:http://www.178linux.com/75133