1. 程式人生 > >Linux - 操作系統信號

Linux - 操作系統信號

web服務器 並且 性能測試 服務 time 進程數量 trap ron highlight

linux操作系統提供的信號

kill -l # 查看linux提供的信號

  

trap "echo aaa" 2 3 15 # shell使用 trap 捕捉退出信號

# 發送信號一般有兩種原因:
# 1(被動式) 內核檢測到一個系統事件.例如子進程退出會像父進程發送SIGCHLD信號.鍵盤按下control+c會發送SIGINT信號
# 2(主動式) 通過系統調用kill來向指定進程發送信號 
# 進程結束信號 SIGTERM 和 SIGKILL 的區別: SIGTERM 比較友好,進程能捕捉這個信號,根據您的需要來關閉程序。在關閉程序之前,您可以結束打開的記錄文件和完成正在做的任務。在某些情況下,假如進程正在進行作業而且不能中斷,那麽進程可以忽略這個SIGTERM信號。
# 如果一個進程收到一個SIGUSR1信號,然後執行信號綁定函數,第二個SIGUSR2信號又來了,第一個信號沒有被處理完畢的話,第二個信號就會丟棄。
SIGHUP 1 A # 終端掛起或者控制進程終止
SIGINT 2 A # 鍵盤終端進程(如control+c)
SIGQUIT 3 C # 鍵盤的退出鍵被按下
SIGILL 4 C # 非法指令
SIGABRT 6 C # 由abort(3)發出的退出指令
SIGFPE 8 C # 浮點異常
SIGKILL 9 AEF # Kill信號 立刻停止
SIGSEGV 11 C # 無效的內存引用
SIGPIPE 13 A # 管道破裂: 寫一個沒有讀端口的管道
SIGALRM 14 A # 鬧鐘信號 由alarm(2)發出的信號 
SIGTERM 15 A # 終止信號,可讓程序安全退出 kill -15
SIGUSR1 30,10,16 A # 用戶自定義信號1 SIGUSR2 31,12,17 A # 用戶自定義信號2 SIGCHLD 20,17,18 B # 子進程結束自動向父進程發送SIGCHLD信號 SIGCONT 19,18,25 # 進程繼續(曾被停止的進程) SIGSTOP 17,19,23 DEF # 終止進程 SIGTSTP 18,20,24 D # 控制終端(tty)上按下停止鍵 SIGTTIN 21,21,26 D # 後臺進程企圖從控制終端讀 SIGTTOU 22,22,27 D # 後臺進程企圖從控制終端寫 缺省處理動作一項中的字母含義如下: A 缺省的動作是終止進程 B 缺省的動作是忽略此信號,將該信號丟棄,不做處理 C 缺省的動作是終止進程並進行內核映像轉儲(dump core),內核映像轉儲是指將進程數據在內存的映像和進程在內核結構中的部分內容以一定格式轉儲到文件系統,並且進程退出執行,這樣做的好處是為程序員提供了方便,使得他們可以得到進程當時執行時的數據值,允許他們確定轉儲的原因,並且可以調試他們的程序。 D 缺省的動作是停止進程,進入停止狀況以後還能重新進行下去,一般是在調試的過程中(例如ptrace系統調用) E 信號不能被捕獲 F 信號不能被忽略

系統性能狀態:

vmstat 1 9

常用參數

r # 等待執行的任務數。當這個值超過了cpu線程數,就會出現cpu瓶頸。
b # 等待IO的進程數量,表示阻塞的進程。
swpd # 虛擬內存已使用的大小,如大於0,表示機器物理內存不足,如不是程序內存泄露,那麽該升級內存。
free # 空閑的物理內存的大小
buff # 已用的buff大小,對塊設備的讀寫進行緩沖
cache # cache直接用來記憶我們打開的文件,給文件做緩沖,(把空閑的物理內存的一部分拿來做文件和目錄的緩存,是為了提高 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)
inact # 非活躍內存大小,即被標明可回收的內存,區別於free和active -a選項時顯示
active # 活躍的內存大小 -a選項時顯示
si # 每秒從磁盤讀入虛擬內存的大小,如果這個值大於0,表示物理內存不夠用或者內存泄露,要查找耗內存進程解決掉。
so # 每秒虛擬內存寫入磁盤的大小,如果這個值大於0,同上。
bi # 塊設備每秒接收的塊數量,這裏的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是1024byte
bo # 塊設備每秒發送的塊數量,例如讀取文件,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。
in # 每秒CPU的中斷次數,包括時間中斷。in和cs這兩個值越大,會看到由內核消耗的cpu時間會越多
cs # 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千並發甚至幾萬並發的測試,選擇web服務器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用。
us # 用戶進程執行消耗cpu時間(user time) us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那麽我們就該考慮優化程序算法或其他措施
sy # 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。
id # 空閑 CPU時間,一般來說,id + us + sy = 100,一般認為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。
wt # 等待IOCPU時間。Wa過高時,說明io等待比較嚴重,這可能是由於磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸。

如果 r 經常大於4,且id經常少於40,表示cpu的負荷很重。
如果 pi po 長期不等於0,表示內存不足。
如果 b 隊列經常大於3,表示io性能不好。

Linux - 操作系統信號