หลายคนคงเคยมีปัญหากับ performance ของ system แล้วหาสาเหตุกันไม่ได้สักที ให้ Vendor มาช่วยดูก็ตอบไม่ได้ว่าทำไม หากมีเงินก็ใช้เงินแก้ปัญหา เปลี่ยน CPU มั่ง เปลี่ยน Storage มั่ง หากไม่มีก็ต้องยอมรับสภาพกันไปอย่างงั้น ถึงแม้ OS เกือบทุกตัวจะมี dynamic tracing มาให้ เช่น systemtap, dtrace, perf แต่การใช้งานนั้น ไม่ได้ง่ายเลย ผู้ใช้งานจำเป็นจะต้องมีความรู้ในระดับ kernel/system call เยอะพอสมควรถึงจะสามารถนำ dynamic tracing พวกนี้ออกมาใช้งานได้ และบางครั้งจำเป็นจะต้องมี source code ด้วยซ้ำไป ผมเองก็ได้ใช้ Dtrace มาบ้าง ซึ่งก็ช่วยแก้ปัญหาเฉพาะหน้าไปได้บ้าง แต่ตัวผมเองก็ไม่ได้มีความรู้ในระดับของ kernel อะไรมากมาย ครั้นจะแก้ปัญหายากๆ ก็ทำไม่ได้ โดยเฉพาะบน Linux ที่ systemtap นั้นง่อยมากๆ และ dtrace ก็ทำ kernel crash ตลอด ทำให้ผมไม่กล้าเอามาใช้ใน production เลย เวลาผ่านไปสามปีตั้งแต่เริ่มงานมา มีหลายครั้งที่ผมแก้ปัญหาไม่ได้ โดยเฉพาะปัญหา System time ขึ้นแล้วหาสาเหตุไม่เจอ (ส่้วนใหญ่จะเจอกับ VM ทั้งหลาย) ซึ่งก็ได้แต่บอกหัวหน้าว่า ย้ายไป physical เถิด แต่ตอบไม่ได้อย่างชัดเจนว่า อะไรทำให้ system ขึ้น ได้แค่กลายๆว่ามันมี overhead ของ i/o system อยู่ (ซึ่งก็ไม่รู้ว่ามีส่วนแค่ไหน)

Sysdig

sysdig เป็น dynamic tracing tool น้องใหม่ล่าสุด พึ่งเปิดตัวได้ไม่กี่อาทิตย์นี้เอง หลักการทำงานของ sysdig นั้นให้นึกถึง tcpdump/wireshark ไว้ครับ แทนที่จะ dump network packet เราก็ dump ทุกอย่าง (event) ที่วิ่งผ่าน kernel ซะเลย o.O  ฟังดูดีและง่ายมากๆ ใครสนใจไปอ่านต่อได้ที่นี่ http://draios.com/sysdig-vs-dtrace-vs-strace-a-technical-discussion/

เรามาลองเล่นกันซะหน่อยดีกว่า โดยเจ้า sysdig เนี่ยเราสามารถเขียน script เพื่อนำมารันกับ dump ของเรา (live/offline) โดยเขียนด้วยภาษา Lua ซึ่งไม่ซับซ้อนและเข้าใจได้ง่าย ไม่เหมือน D lang ของ Dtrace หรือ Systemtap โดย script นี้เค้าจะเรี่ยกว่า Chisels โดยเราสามารถรันคำสั่ง -cl เพื่อดู Chisels ที่ติดมากับ sysdig ได้

root@kz-G41M-Combo:/home/kz# sysdig -cl

Category: CPU Usage
——————-
topprocs_cpu    Top processes by CPU usage

Category: I/O
————-
echo_fds        Print the data read and written by processes.
fdbytes_by      I/O bytes, aggregated by an arbitrary filter field
fdcount_by      FD count, aggregated by an arbitrary filter field
iobytes         Sum of I/O bytes on any type of FD
iobytes_file    Sum of file I/O bytes
stderr          Print stderr of processes
stdin           Print stdin of processes
stdout          Print stdout of processes
topfiles_bytes  Top files by R+W bytes
topfiles_time   Top files by time
topprocs_file   Top processes by R+W disk bytes

Category: Net
————-
iobytes_net     Show total network I/O bytes
spy_ip          Show the data exchanged with the given IP address
spy_port        Show the data exchanged using the given IP port number
topconns        top network connections by total bytes
topports_server Top TCP/UDP server ports by R+W bytes
topprocs_net    Top processes by network I/O

Category: Performance
———————
bottlenecks     Slowest system calls
topscalls       Top system calls by number of calls
topscalls_time  Top system calls by time

Category: Security
——————
spy_users       Display interactive user activity

Category: errors
—————-
topfiles_errors top files by number of errors
topprocs_errors top processes by number of errors

จะเห็นว่าครอบคลุมการ troubleshoot พอสมควรเลยทีเดียว โดยเราสามารถรัน script Chisels ได้ด้วย sysdig -c topprocs_net แค่นี้เองครับ เราก็จะได้ผลลัพธ์ออกมาว่าใครเป็น top user ใน network i/o

ที่นี่ถ้าเราจะรัน script ที่เราเขียนเองละก็ ก็แค่เขียนแล้วเซฟลงไปในไฟล์ แล้วก็รันด้วยคำสั่งเดิมได้เลย ในตัวอย่างนี้ผมไป copy Chisels fileslower มาจากที่นี่ https://github.com/brendangregg/sysdig/blob/d0eeac1a32d6749dab24d1dc3fffb2ef0f9d7151/userspace/sysdig/chisels/fileslower.lua

ความสามารถของ script นี้คือจะแสดงว่าใครบ้างที่ access ไฟล์ใช้เวลานานมากกว่า x ms ในที่นี้คือ 10ms

root@kz-G41M-Combo:/home/kz# sysdig -c fileslower 10
TIME                    PROCESS      TYPE     LAT(ms) FILE
2014-04-20 22:05:00.286 kdeinit4     read          13 /media/kz/HGST1TB/allPic/PIC/117.jpeg
2014-04-20 22:05:19.860 kdeinit4     read          13 /media/kz/HGST1TB/2013/2013-07-28/DSCN8261.JPG

นอกจากนี้รายังสามารถรันคำสั่งง่ายๆ เพื่อ trace program ใดๆก็ได้ดังนี้

sysdig-stdout-capture-python

 

 

 

 

 

 

 

ในตัวอย่างนี้ผมเขียน script python print 1..1000 ออกมา แล้วใช้ sysdig ดักจับ stdout ของ python จะเห็นว่าเพียงแค่เพิ่ม proc.name=python มาแค่นั้นเอง

เจ้า sysdig นี่มันใช้งานง่ายมาก แล้วก็ดูมีอนาคตมากๆ หลังจากผมเล่นได้ไม่กี่นาที ก็สามารถนำไปใช้งานจริงได้แล้ว และมันทำให้ Linux powerful ขึ้นมาเทียบเคียงได้กับ Solaris เลยทีเดียว และเมื่อไหร่ที่ Btrfs stable ละก็ผมคงเลือก linux เป็น enterprise os ของผมแน่นอน ยอมทิ้ง Solaris zone/zfs เลยละ ในอนาคตผมเชื่อว่านี่คืออีกโปรแกรมที่จะติดมากับ linux แทบทุก distro