คู่มือเกมแลค › L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
ประสิทธิภาพเปลี่ยนไปหลังอัปเดต OS/เคอร์เนล/ไดรเวอร์/เฟิร์มแวร์ Performance regression after OS / kernel / driver / firmware update
ID สาเหตุ so-os-update · ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
โค้ดเกมเหมือนเดิม แต่เซิร์ฟเวอร์ช้าลงตั้งแต่อัปเดต OS, เคอร์เนล, ไดรเวอร์ หรือเฟิร์มแวร์ การอัปเดตอาจเปลี่ยนค่าเริ่มต้น, scheduler, การป้องกันช่องโหว่ CPU (mitigations) และพฤติกรรมของไดรเวอร์
ทำไม แพตช์ความปลอดภัยตามรอบหรืออิมเมจเซิร์ฟเวอร์ใหม่ทำให้เคอร์เนล ไดรเวอร์ หรือเฟิร์มแวร์เปลี่ยน → ผลคือ ค่าเริ่มต้นหรือ scheduler เปลี่ยน หรือเปิด mitigation ตัวใหม่ งานเดิมจึงใช้ CPU time มากขึ้น และลำดับที่เธรดได้รับ CPU เปลี่ยนไป → บนหน้าจอ เซิร์ฟเวอร์ที่เคยลื่นช้าลงนิดหน่อยตลอดเวลาตั้งแต่วันที่อัปเดต: อินพุตดีเลย์ และพอคนแห่มารวมกันก็กระตุกและเป็นสโลว์โมชั่น
อาการ อินพุตดีเลย์ , กระตุก , สโลว์โมชั่น
ปัจจัย ความหน่วง, การหยุดชะงัก, จิตเตอร์
ใครเจอ ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร ตลอดเวลา, ตอนคนแห่มารวมกัน
ผู้รับผิดชอบ ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
งานฝั่งทีมอินฟรา ลงอัปเดตกับเซิร์ฟเวอร์บางเครื่องก่อน แล้วเทียบเวลาต่อทิก ความหน่วง และอัตราการใช้ CPU กับเวอร์ชันก่อนหน้าก่อนขยายวง, deploy คนละวันกับแพตช์เกม, บันทึกเวอร์ชันเคอร์เนล ไดรเวอร์ เฟิร์มแวร์ และค่า sysctl สำคัญก่อนและหลังอัปเดต, ถ้ามีปัญหาให้บูตด้วยเคอร์เนลเดิมเพื่อยืนยัน, ชั่งความเสี่ยงด้านความปลอดภัยก่อนตัดสินใจปิด mitigation (mitigations=off)
ตัวเลขที่ควรรู้ เมื่อเวอร์ชันเคอร์เนลเปลี่ยน พฤติกรรมเริ่มต้นก็เปลี่ยนด้วย เช่น Linux เริ่มย้าย scheduler จาก CFS ไปเป็น EEVDF ตั้งแต่ 6.6 และค่าเริ่มต้นของเพดานคิวรอเชื่อมต่อ (somaxconn) ก็เปลี่ยนจาก 128 เป็น 4,096 ตั้งแต่ 5.4 การป้องกันช่องโหว่ CPU เพิ่มงาน เช่น ล้างบัฟเฟอร์ภายใน CPU ตอนกลับจากเคอร์เนลไปยังโปรแกรม (ทุกครั้งที่จบ system call) และตอน context switch หรือสลับเข้าออก VM เซิร์ฟเวอร์เครือข่ายที่เรียก system call ทุกแพ็กเก็ตจึงได้รับผลมากกว่า ช่องโหว่บางตัวต้องปิด SMT (ฟีเจอร์ที่ให้หนึ่งคอร์ทำงานเหมือนสองเธรด) จึงจะป้องกันได้สมบูรณ์ และการปิด SMT อาจทำให้ประสิทธิภาพลดลงมากแล้วแต่ประเภทงาน พารามิเตอร์เคอร์เนล mitigations=off ปิดการป้องกันทั้งหมดนี้เพื่อเอาประสิทธิภาพคืน แต่ระบบจะเสี่ยงต่อช่องโหว่เหล่านั้น
บนกราฟ ขึ้นเป็นขั้นบันไดจากจุดหนึ่ง · เวลาต่อทิกของเซิร์ฟเวอร์, อัตราการใช้ CPU, ความหน่วงที่โหลดเท่ากัน
จุดที่ต้องดู ประวัติการอัปเดตจาก package manager และเวลารีบูต, เวอร์ชันเคอร์เนลจาก uname -r, ข้อมูลไดรเวอร์ NIC จาก ethtool -i เทียบกับเวลาที่ความหน่วงเริ่มสูง และเทียบเซิร์ฟเวอร์ที่อัปเดตกับที่ยังไม่อัปเดตภายใต้โหลดเท่ากันด้วย mpstat และ pidstat รวมถึงสถานะ mitigation ใน /sys/devices/system/cpu/vulnerabilities/ สัญญาณว่าใช่ ความหน่วงและอัตราการใช้ CPU ขึ้นหนึ่งขั้นตั้งแต่รีบูตหลังอัปเดตแล้วอยู่ระดับนั้น ที่โหลดเท่ากัน เฉพาะเซิร์ฟเวอร์ที่อัปเดตเท่านั้นที่สูง บูตด้วยเคอร์เนลหรือไดรเวอร์เดิมแล้วกลับเป็นปกติ สัญญาณว่าไม่ใช่ เซิร์ฟเวอร์ที่อัปเดตกับที่ยังไม่อัปเดตช้าเท่ากันที่โหลดเท่ากัน: ไม่ใช่สาเหตุนี้ ถ้าวันเดียวกัน deploy แพตช์เกมด้วย และจำนวนหรือขนาดแพ็กเก็ตต่อผู้เล่นเปลี่ยน ให้ดู “แพตช์ทำให้รูปแบบทราฟฟิกเปลี่ยน” วิธีตรวจ ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
รายละเอียดเพิ่มเติม ตรวจสถานะ mitigation ได้จากไฟล์ใต้ /sys/devices/system/cpu/vulnerabilities/ ค่าเริ่มต้น (mitigations=auto) ป้องกันโดยยังเปิด SMT ไว้ แต่ถ้าตั้ง auto,nosmt จะปิด SMT บน CPU ที่มีช่องโหว่ หลังอัปเกรดเคอร์เนล จำนวนคอร์ตรรกะ (logical core) จึงอาจลดลงครึ่งหนึ่ง ถ้าอัปเดต OS วันเดียวกับแพตช์เกมจะแยกสาเหตุได้ยาก จึงควร deploy แยกกัน
แหล่งอ้างอิง The kernel’s command-line parameters Linux kernel mitigations=: off ปิดการป้องกันช่องโหว่ CPU ทั้งหมดเพื่อเพิ่มประสิทธิภาพแต่จะเสี่ยงต่อช่องโหว่, ค่าเริ่มต้น auto ป้องกันโดยเปิด SMT ไว้, auto,nosmt ปิด SMT เมื่อจำเป็น MDS - Microarchitectural Data Sampling Linux kernel mitigation จะล้างบัฟเฟอร์ CPU ตอนกลับจากเคอร์เนลไปยัง user space และตอนเข้า VM, ตรวจสถานะช่องโหว่และ mitigation ได้จากไฟล์ใต้ /sys/devices/system/cpu/vulnerabilities/, CPU จำนวนมากต้องปิด SMT จึงจะป้องกันได้สมบูรณ์ และการปิด SMT อาจกระทบประสิทธิภาพมากแล้วแต่งาน Spectre Side Channels Linux kernel เพื่อป้องกันช่องโหว่ จะล้างบัฟเฟอร์ branch prediction ตอน context switch และตอนสลับ VM, mitigation แบบเข้มเพิ่ม overhead ให้ทุกโปรแกรม EEVDF Scheduler Linux kernel Linux เริ่มย้ายจาก CFS ไปใช้ scheduler EEVDF ตั้งแต่ 6.6 listen(2) — Linux manual page Linux man-pages ค่าเริ่มต้นของ somaxconn เปลี่ยนจาก 128 เป็น 4,096 ตั้งแต่ Linux 5.4 ethtool(8) — Linux manual page ethtool ดูข้อมูลไดรเวอร์ของอุปกรณ์เครือข่ายด้วย ethtool -i
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (อินพุตดีเลย์)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง