Thursday, November 17, 2005

top กะ ps

รู้สึกว่า Server มันอืดๆ ลองเปิด top ดูพบว่า
top - 19:15:19 up 272 days,  8:34,  7 users,  load average: 6.20, 6.19, 5.60
Tasks: 150 total,   3 running, 146 sleeping,   0 stopped,   1 zombie
Cpu0  : 96.2% us,  0.0% sy,  0.0% ni,  3.8% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu1  : 97.8% us,  1.0% sy,  0.0% ni,  1.3% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu2  : 95.5% us,  0.6% sy,  0.0% ni,  2.9% id,  0.3% wa,  0.0% hi,  0.6% si
Cpu3  : 96.1% us,  1.6% sy,  0.0% ni,  2.3% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   2074216k total,  1776132k used,   298084k free,    11824k buffers
Swap:  2048276k total,   714640k used,  1333636k free,   619644k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME   COMMAND
19573 webls2    16   0  2144 1148 1912 R  1.3  0.1   0:00.16 top
18319 root      15   0  1584  576 1368 S  0.3  0.0   0:09.41 pptpctrl
18683 vuthi     16   0  7128 2404 6504 S  0.3  0.1   0:00.75 sshd
    1 root      16   0  1400  380 1240 S  0.0  0.0   0:05.27 init
    2 root      RT   0     0    0    0 S  0.0  0.0   5:04.08 migration/0
Load ขึ้นไป 6 กว่า, CPU ถูกกินอยู่ทุกตัว (แปลว่ามี Process ที่รันหนักๆอยู่อย่างน้อย 4 Process) แต่รายชื่อ Process ข้างล่าง ไม่ยักบอกว่า Process ไหนกำลังกิน CPU คิดว่าคงเป็น Thread ย่อยๆของ Process พวกนี้แหละ

เดี๋ยวนี้คำสั่ง top กะ ps ไม่ค่อยจะยอมแสดง Thread แล้ว นอกจากจะระบุตัวเลือกโดยตรง เช่น ps aHux --sort %cpu ซึ่งได้ผลออกมาว่า

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        10  0.0  0.0      0     0 ?        S<   Feb18   0:00 [events/0]
root        11  0.0  0.0      0     0 ?        S<   Feb18   0:00 [events/1]
root        12  0.0  0.0      0     0 ?        S<   Feb18   0:00 [events/2]
...
ana      14843  0.3  0.1   7584  2796 ?        S    15:00   0:47 sshd: ana@pts/13 
root     23060  2.1 40.0 1406992 829944 ?      Sl   Nov16  39:06 /usr/java/...
root     23060  2.5 40.0 1406992 829944 ?      Sl   Nov16  45:54 /usr/java/...
เห็นแล้วยังงงอยู่ดี เพราะ Thread ที่กิน %CPU สูงสุดตอนนี้ก็แค่ 2.5% !! แล้วไอ้ %CPU ~95% สี่ตัวข้างบนมาจากไหน? ลองเรียก ps aHux --sort %cpu หลายๆครั้งก็ได้ผลเหมือนกัน

ตกลงเลยไม่รู้ว่าใครกิน CPU อยู่ !! ต้องลอง Restart ทีละ Process จนเจอว่าปัญหาอยู่ที่ Tomcat server ที่ ps บอกว่ากินแค่ 2.5% นั่นแหละ อาการหายกลับเป็นปกติทันที

มีทางทำไงให้ top แสดงรายละเอียดแยกเป็น Thread บ้างไหมเนี่ย ps ชักเชื่อถือไม่ได้ (Debian Linux)

5 comments:

NOI said...

เอ .. ใช่ ps -aux หรือเปล่าครับ ? (หนูไม่รู้ หนูเดา)

Hui/ฮุ้ย said...

Otto บอกให้ไปดู
procps FAQ
เขาบอกว่า
"You need to upgrade to the 2.6.10 kernel at least.
Older kernels do not provide a reasonable way
to get this information"
พอดีเครื่องนี้ใช้ 2.6.8 อยู่

bact' said...

ถ้าดู Java process นี่ ใช้ jps จะช่วยมั๊ยเนี่ย ...

ob the air said...

อาการกินcpuโดยไม่รู้สาเหตุของ tomcat นี่ ผมก็เคยเจอ แต่เป็นบน win2000
ปล่อยมันรันธรรมดานี่แหละ มีเรียกใช้ jsp บ้างเป็นระยะๆ อยู่ดีๆมันก็กิน 25% ไปตัวนึง สักพักก็กินเยอะขึ้น สุดท้ายกินเต็มร้อย ทำงานไม่ได้ ไม่รู้เป็นไรของมัน เขียน jsp ผิดเองก็เปล่า เพราะลองหมดทุกหน้าทุกกรณีก็ไม่เจอสาเหตุ แต่บางทีปล่อยทิ้งไว้เฉยๆกลับเป็น
เจออย่างนี้แก้วิธีเดียว kill process tomcat มันเลย แล้วสตาร์ทใหม่

bact' said...

สร้าง Object เยอะเกินไป ? (คือเราอาจจะไม่ได้สร้างเยอะเกิน แค่นิด ๆ หน่อย ๆ แต่พอนาน ๆ ไปมันก็เยอะ)
ทั่ว ๆ ไปที่เห็นเค้าทำกันก็ ลองลด String แล้วไปใช้ StringBuffer แทนบ้าง
pool object บางตัวที่น่าจะแชร์ได้
และถ้าชัวร์ว่าตัวไหนไม่ได้ใช้จริง ๆ แล้ว ก็ = null มันไปเลย gc จะได้รู้ชัด ๆ