如何分析D狀態程序

2021-08-09 14:06:44 字數 1799 閱讀 5808

在使用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的可執行佇列中 乙個程序最多只能...