內核的功用
進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等
Process: 運行中的程序的一個副本,是被載入內存的一個指令集合
進程ID(Process ID,PID)號碼被用來標記各個進程
UID、GID、和SELinux語境決定對文件系統的存取和訪問權限,
通常從執行進程的用戶來繼承
存在生命周期
task struct:
Linux內核存儲進程信息的數據結構格式
task list:
多個任務的的task struct組成的鏈表
進程創建:
init:第一個進程 centos6 centos7上使用的是 systemd
父子關系
進程:都由其父進程創建
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和端口號
進程狀態
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目錄下的各文件中(每PID代表每一個進程)
top
排序:(進入命令后)
P:以占據的CPU百分比,%CPU
M:占據內存百分比,%MEM
T:累積占據CPU時長,TIME+
首部信息顯示: (進入命令后) 顯示或隱藏
uptime信息:l命令
tasks及cpu信息:t命令
cpu分別顯示:1 (數字) 顯示總的,還是單個顯示(多核)
memory信息:m命令
退出命令:q (下面都在命令當中修改刷新間隔)
修改刷新時間間隔:s 輸入s 再指定PID
終止指定進程:k
保存文件:W
欄位信息簡介 CPU
us:用戶空間
sy:內核空間
ni:調整nice時間
id:空閑
wa:等待IO時間
hi:硬中斷
si:軟中斷(模式切換)
st:虛擬機偷走的時間
在命令輸入之前就指定相關參數
選項:
-d #: 指定刷新時間間隔,默認為3秒
-b: 全部顯示所有進程
-n #: 刷新多少次后退出
PID — 進程id
USER — 進程所有者
PR — 進程優先級
NI — nice值。負值表示高優先級,正值表示低優先級
VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR — 共享內存大小,單位kb
S — 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程
%CPU — 上次更新到現在的CPU時間占用百分比
%MEM — 進程使用的物理內存百分比
TIME+ — 進程使用的CPU時間總計,單位1/100秒
COMMAND — 進程名稱(命令名/命令行)
htop
top的增強版(要安裝)
htop命令:需從Fedora-EPEL源安裝 http://172.16.0.1/fedora-epel/7/x86_64
選項:
-d #: 指定延遲時間;
-u UserName: 僅顯示指定用戶的進程
-s COLUME: 以指定字段進行排序
子命令:
s: 跟蹤選定進程的系統調用
l: 顯示選定進程打開的文件列表
a:將選定的進程綁定至某指定CPU核心
t: 顯示進程樹
ps
ps [OPTION]…
支持三種選項:
UNIX選項 如-A -e
BSD選項 如a
GNU選項 如–help
選項:默認顯示當前終端中的進程
a 選項包括所有終端中的進程
x 選項包括不鏈接終端的進程
u 選項顯示進程所有者的信息
f 選項顯示進程的父進程
k|–sort 屬性 對屬性排序
o 屬性… 選項顯示定制的信息
pid、comm、%cpu、%mem、state、tty、euser、ruser
進程管理工具
VSZ: Virtual memory SiZe,虛擬內存集,線性內存 (操作系統承諾給你多少內存給你分配了)
RSS: ReSident Size, 常駐內存集 (真正物理內存分配出來的大?。?br />STAT:進程狀態
R:running
S: interruptable sleeping 可中斷的休眠
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
L:內存分頁并帶鎖
N:低優先級進程
<: 高優先級進程
s: session leader,會話(子進程)發起者
常用組合:-ef
-e: 顯示所有進程
-f: 顯示完整格式程序信息
常用組合:-eFH
-F: 顯示更完整格式的進程信息
-H: 以進程層級格式顯示進程相關信息
常用組合:自定義
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
euid 正在執行的用戶(SUID實別不出來)
ruid 真正執行的用戶(SUID實別出來)
進程優先級
ni: nice值
pri: priority 優先級
psr: processor CPU編號
rtprio: 實時優先級
示例:ps axo pid,cmd,psr,ni,pri,rtprio
pri nice優先級 默認19
psi 系統優先級 默認0
進程優先級調整:
靜態優先級:100-139
進程默認啟動時的nice值為0,優先級為120
只有根用戶才能降低nice值(提高優先性)
nice命令: nice [OPTION] [COMMAND [ARG]…]
renice命令: renice [-n] priority pid…
例:renice -n 10 pid
注:root用戶可以隨意調整大小
基本用戶調整,只能調大
查看: ps axo pid,comm,ni
可能在創建文件時,直接給定優先級
例: nice -n 5 vim xdg
搜索進程
最靈活:ps 選項 | 其它命令
按預定義的模式:pgrep
pgrep [options] pattern
-u uid: effective user 生效者
-U uid: real user 真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示指定進程的子進程
注:pgrep -lu wang
u 后面要直接跟用戶 (順序不能的換)
按確切的程序名稱:/sbin/pidof
pidof bash
查看PID
例:ps -C f1.sh -C f2.sh o pid,cmd,%cpu,%mem
-C 指定文件名
查看多個進程
注:在腳本當中,shebang機制 –> #!/bin/bash
要加入,不加的話,在ps查看進程的時候,查看不到f1.sh這個名字,只能看到bash
注:跟pgrep不同
kill命令
向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,
信號名稱以SIG開頭(可省略),不區分大小寫
顯示當前系統可用信號: kill –l,trap -l
常用信號:man 7 signal
1) SIGHUP: 無須關閉進程而讓其重讀配置文件
2) SIGINT: 中止正在運行的進程;相當于Ctrl+c
3) SIGQUIT:相當于ctrl+\ 相當于quit
9) SIGKILL: 強制殺死正在運行的進程
15) SIGTERM:終止正在運行的進程 默認的信號(有些進程終止不了)
18) SIGCONT:繼續運行
19) SIGSTOP:后臺休眠
注: kill -0 PID 不發任何信號,判斷當前進程是否正常運行
正常運行 echo $? –> 0
指定信號的方法:
(1) 信號的數字標識:1, 2, 9
(2) 信號完整名稱:SIGHUP
(3) 信號的簡寫名稱:HUP
注:在傳輸信息的時候,上面的三種方式都可以表示出來
按PID:
kill [-SIGNAL] pid …
kill –n SIGNAL pid
kill –s SIGNAL pid
其中-s 9 制定了傳遞給進程的信號是9,即強制、盡快終止進程。
按名稱:
killall [-SIGNAL] comm…
例: killall -0 httpd &> /dev/nul || service httpd restart
-0信號檢查該進程是否啟動
killall命令用于殺死指定名字的進程(kill processes by name)。
我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,
我們還需要在之前使用ps等命令再配合grep來查找進程,而killall把這兩個過程合二為一。
killall 信號 commond
按模式:
pkill [options] pattern
-SIGNAL -u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名(pgrep可用)
-a: 顯示完整格式的進程名(pgrep可用)
-P pid: 顯示指定進程的子進程
vmstat
命令:虛擬內存信息
vmstat [options] [delay [count]]
例:vmstat 2 5 顯示內存信息 刷新間隔2s 刷新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: inter rupts 中斷速率,包括時鐘
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.
iostat
統計CPU和設備IO信息
示例:iostat 1 10 刷新間隔1s 刷新10次結束
例:
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
每秒鐘的事務 讀速度 寫速度 總量讀 總量寫
pmap命令:進程對應的內存映射(顯示進程使用哪塊內存空間)
pmap [options] pid […]
-x: 顯示詳細格式的信息
例:pmap -x 1 1:PID
或pmap 1
另外一種實現:
cat /proc/PID/maps
原創文章,作者:_xddggg,如若轉載,請注明出處:http://www.www58058.com/85536