在使用top檢視程序狀態時,我們有時候會看到d狀態的程序。
w: s -- process status
the status of
the task which can be one
of: 』d』 = uninterruptible sleep
』r』 = running
』s』 = sleeping
』t』 = traced or stopped
』z』 = zombie
d是一種不可中斷的sleep,如果你發現大量的d狀態的程序,這個時候這些程序實際上是沒有在處理業務邏輯的。
例如使用postgresql時,批量的往資料庫匯入資料,如果匯入的資料量大到os髒頁回寫的速度趕不上寫入的速度時,並且使用者刷dirty page的閾值到達,使用者程序會需要主動刷髒頁。
vm.dirty_background_ratio = 10
vm.dirty_background_bytes = 0
vm.dirty_ratio = 20
vm.dirty_bytes = 0
vm.dirty_writeback_centisecs = 50
vm.dirty_expire_centisecs = 6000
例如以上配置,os髒頁超過20%時,使用者調write也需要主動的刷髒頁,就會看到程序處於d狀態,直到髒頁水位下降到10%以下。
當然還有其他的原因會導致程序進入d狀態,我們需要觀察程序的stack,看看它處於什麼狀態。
例如處於r狀態的copy postgresql程序,它的stack是什麼樣的?
cat /proc/17944/status ;echo -e "\n";cat /proc/17944/stackname:
postgres
state:r (running)tgid: 17944pid: 17944ppid: 57925tracerpid: 0uid: 123293 123293 123293 123293gid: 100 100 100 100utrace: 0fdsize: 64groups: 100 19001vmpeak: 272294920kb
vmsize: 119788kb
vmlck: 0kb
vmhwm: 3244kb
vmrss: 2812kb
vmdata: 2140kb
vmstk: 152kb
vmexe: 5852kb
vmlib: 2400kb
vmpte: 64kb
vmswap: 0kb
ffffffff,ffffffff
cpus_allowed_list: 0-63mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001mems_allowed_list: 0voluntary_ctxt_switches: 55758nonvoluntary_ctxt_switches: 103995
sys_semtimedop+0x81a/0x840
0xffffffffffffffff
linux下如何殺掉D狀態程序
d狀態 disk sleep 程序用kill 9命令是不管用的,最簡單的方法就是reboot,除此還可以修改核心,將其程序狀態轉化為別的狀態,然後kill掉。新建資料夾,cd進去,新建killd.c 檔案,如下 include include needed by all modules includ...
linux程序狀態D
程序狀態d,往往是由於 i o 資源得不到滿足而引發等待 舉個例子,當 nfs 服務端關閉之時,若未事先 umount 相關目錄,在 nfs 客戶端執行 df 就會掛住整個登入會話,按 ctrl c ctrl z 都無濟於事。斷開連線再登入,執行 ps axf 則看到剛才的 df 程序狀態位已變成了...
程序狀態解析 如何殺死殭屍程序
某日利用阿里雲的基線檢查,發現2個殭屍程序,因此,我想要殺死它們。怎麼殺?首先先的抓出殭屍。執行的程序,都會有程序的狀態 只有在該狀態的程序才可能在cpu上執行。而同一時刻可能有多個程序處於可執行狀態,這些程序的task struct結構 程序控制塊 被放入對應cpu的可執行佇列中 乙個程序最多只能...