進程概念
內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等
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.www58058.com/75133