Kernel Patches

mm4 patch สำหรับ 2.6.8.1 รีลีสแล้ว เร็วดังคาด .. แพตช์ตัวนี้มี experimental code ชุดใหม่เข้ามา ยังไม่ได้ทดสอบในวงกว้าง ใครอยากทดสอบหรือชอบเสี่ยงก็ ดาวน์โหลด ไปใช้ได้

ck4 patch ของ Con Kolivas รีลีสแล้วเหมือนกัน .. แพตช์/จูนสำหรับเดสก์ท็อปเช่นเคย มีแพตช์ workaround kernel กับ cdrecord ไว้แล้วด้วย ใครใช้งาน CD/DVD Writer เอาแพตช์นี้ไปใช้ก่อนระหว่างรอแก้ไขในเคอร์เนลจริงๆ อีกที ในแพตช์เซ็ตมี Reiser4FS ด้วย ว่ากันว่าเร็วโคตรๆ ..

CK แนะนำว่า เคอร์เนล 2.6 ไม่จำเป็นต้องใช้ kernel preemptible ก็ได้ จะ enable หรือ disable ก็ไม่รู้สึกอะไร เพราะ latency ของ 2.6 ถึงไม่มี preempt ก็ต่ำ(กว่า 2.4)อยู่แล้ว การ enable kernel preemptible อาจจะทำให้โปรแกรมบางโปรแกรมทำงานเพี้ยนอีกด้วย ผมก็เจอบ้างเหมือนกัน เช่น NVIDIA ถ้าภาระงานหนักๆ โมดูลจะทำงานอืดอย่างเห็นได้ชัด ALSA เองก็จะกระตุกๆๆ เท่าที่มีการรายงานบางจังหวะแย่ถึงขนาด latency เกิน 50 msec ก็มี ..

เพื่อแก้ปัญหานี้ Ingo Molnar กับ Arjan van de Ven (@ Red Hat) เสนอโมเดลและแพตช์ชื่อ “Voluntary Kernel Preemption” มาเสริมการทำงานของเคอร์เนล 2.6 .. วิธีการคือดึงเอาจังหวะ might_sleep() ในเคอร์เนลมาใช้ + แก้ไขโค้ด จัด schedule ใหม่ (ผมเดาว่า การใช้ might_sleep() คงเป็นที่มาของคำว่า voluntary – เพราะจุดที่เรียก might_sleep() แปลว่ามันอาสาที่จะ sleep แล้ว) .. การทดสอบ voluntary kernel preemption โดยตัว Ingo เองได้ latency ออกมาไม่ถึง 1 ms แม้จะอัดภาระงานเข้าไปเต็มๆ แล้วก็ตาม .. ตัวเลข 1 msec นี่ถือว่าเทียบเท่าหรืออาจจะดีกว่าเคอร์เนล 2.4 + low latency patch ของ Andrew Morton ที่กลุ่ม Linux Audio นิยมใช้กันเสียอีก :)

อย่างไรก็ตามแฮ็กเกอร์บางคน (i.e., Christoph Hellwig, Andrea Arcangeli) ก็ไม่ค่อยจะเห็นด้วยกับการใช้จังหวะ might_sleep() มา reschedule / preempt เพราะโดยหลักการแล้ว might_sleep() มีนิยามในการทำงานของมันเอง และถ้าจะทำอะไรกับ scheduling ก็มี cond_resched() API ให้ใช้อยู่แล้ว .. Ingo ก็ยอมรับว่ามันมีผลดีผลเสียที่ต้อง tradeoff กันอยู่ ที่เสนอให้ใช้ might_sleep() ก็เพราะมันได้ผลที่ดี ประหยัดกว่า และปลอดภัยกว่า .. จะใช้หรือไม่ก็ตัดสินใจเอาเอง โดยสรุป voluntary kernel preepmtion จะเหมาะกับเครื่องที่ต้องการ latency ต่ำๆ ต้องการการตอบสนองที่ดี เช่น digital audio/video workstation แต่อาจจะไม่เหมาะกับเซิร์ฟเวอร์ที่ต้องการทรูพุตสูงๆ .. voluntary kernel preemption สามารถ enable/disable ขณะที่เครื่องทำงานอยู่ได้ตลอดเวลาผ่านทาง /proc ..

ระหว่างนี้ Ingo กำลังทำแพตช์อีกตัวนึงเพื่อปรับปรุง kernel preemption โดยแพตช์ที่จะออกตามมานี้จะจูน preemption ในระดับ per-task ได้เลย :)