คู่มือขั้นสูงสำหรับการเพิ่มประสิทธิภาพเคอร์เนล Linux และลดความหน่วง

การปรับปรุงครั้งล่าสุด: 1 เดือนมีนาคมของ 2026
  • การปรับแต่งเคอร์เนลของลินุกซ์จำเป็นต้องผสานรวมการกำหนดค่าทางสถาปัตยกรรม sysctl และการจัดตารางการทำงานของ CPU โดยคำนึงถึงความหน่วงเวลา
  • เคอร์เนลแบบกำหนดเองและแพตช์ PREEMPT_RT ช่วยลดความหน่วงได้อย่างมาก แต่ก็มีความซับซ้อนและต้องบำรุงรักษามากขึ้น
  • การเพิ่มประสิทธิภาพเครือข่าย หน่วยความจำ ดิสก์ และบริการระบบ ควรได้รับการวัดผลด้วยการตรวจสอบและเปรียบเทียบประสิทธิภาพอย่างเข้มงวดเสมอ
  • แนวทางการทำงานแบบวนซ้ำโดยอาศัยตัวชี้วัด จะเปลี่ยนการปรับปรุงหลักให้กลายเป็นประโยชน์ที่แท้จริงสำหรับแอปพลิเคชันและผู้ใช้งาน

การเพิ่มประสิทธิภาพเคอร์เนล Linux เพื่อลดความหน่วง

เมื่อพูดถึงประสิทธิภาพใน Linux แทบทุกอย่างมักชี้ไปที่สิ่งเดียวกัน นั่นคือ เคอร์เนล ซึ่งเป็นส่วนประกอบหลักที่ควบคุมความหน่วง ความเสถียร และการใช้ทรัพยากรการปรับแต่งเคอร์เนลอย่างละเอียดสามารถสร้างความแตกต่างระหว่างระบบที่ "พอใช้งานได้" กับระบบที่ตอบสนองได้อย่างราบรื่นบนเซิร์ฟเวอร์ เดสก์ท็อป สภาพแวดล้อมคลาวด์ หรือแม้แต่ฮาร์ดแวร์รุ่นเก่ามากๆ

คู่มือนี้มุ่งเน้นวิธีการปรับแต่งเคอร์เนล Linux เพื่อลดความหน่วงให้น้อยที่สุดโดยไม่กระทบต่อความปลอดภัยหรือความสามารถในการบำรุงรักษาเราจะครอบคลุมทุกอย่างตั้งแต่แนวคิดพื้นฐานทางสถาปัตยกรรมไปจนถึงการปรับแต่งด้วย sysctl การคอมไพล์เคอร์เนลแบบกำหนดเอง การใช้แพตช์แบบเรียลไทม์ การปรับแต่งสำหรับเครือข่ายที่มีความหน่วงต่ำ (เช่น EC2) และเทคนิคการตรวจสอบและการวัดประสิทธิภาพเพื่อตรวจสอบว่าการปรับแต่งของคุณช่วยปรับปรุงประสิทธิภาพได้จริงหรือไม่

สถาปัตยกรรมเคอร์เนลของลินุกซ์และประเด็นสำคัญที่ส่งผลต่อความหน่วง

เคอร์เนลของลินุกซ์ทำหน้าที่เป็นชั้นกลางระหว่างแอปพลิเคชันและฮาร์ดแวร์ โดยจัดการหน่วยความจำ กระบวนการ การขัดจังหวะ ไดรเวอร์ และระบบไฟล์ การออกแบบที่ เป็นเอกภาพแต่ก็มีความยืดหยุ่นสูงด้วยโมดูลที่สามารถโหลดได้ ทำให้สามารถเปิดหรือปิดใช้งานฟังก์ชันต่างๆ ได้อย่างยืดหยุ่นโดยไม่ต้องคอมไพล์ระบบใหม่ทั้งหมด

เพื่อให้เข้าใจถึงสาเหตุของความล่าช้า จำเป็นอย่างยิ่งที่จะต้องเข้าใจระบบย่อยหลายระบบ ได้แก่ตัวจัดตารางเวลาของกระบวนการการจัดการหน่วยความจำ และการจัดการการขัดจังหวะ ตัวจัดตารางเวลาที่ตั้งค่าไม่ดี นโยบายหน่วยความจำที่เข้มงวด หรือจำนวนการขัดจังหวะที่ควบคุมไม่ได้มากเกินไป อาจส่งผลให้เวลาตอบสนองช้าลง แม้จะมีฮาร์ดแวร์ที่ทรงพลังก็ตาม

ตัวเลือกการกำหนดค่าเคอร์เนล เช่นCONFIG_PREEMPT, CONFIG_PREEMPT_VOLUNTARY และ CONFIG_SMP มีบทบาทสำคัญ ตัวเลือกเหล่านี้จะกำหนดขอบเขตที่เคอร์เนลสามารถถูกขัดจังหวะเพื่อจัดการกับงานที่เร่งด่วนกว่า และวิธีการจัดการระบบมัลติคอร์ การเลือกรูปแบบการขัดจังหวะที่เหมาะสมจะเปลี่ยนแปลงความหน่วงที่รับรู้ได้บนเดสก์ท็อป เซิร์ฟเวอร์ที่มีความหน่วงต่ำ หรือระบบอุตสาหกรรมอย่างมาก

ในเซิร์ฟเวอร์สมัยใหม่ โครงสร้างฮาร์ดแวร์ก็มีความสำคัญเช่นกัน ได้แก่การกระจายตัวของคอร์ ซ็อกเก็ต NUMA และลำดับชั้นของแคชการปรับแต่งความสัมพันธ์ของ CPU และนโยบาย NUMA อย่างละเอียด (เช่น การกำหนดกระบวนการและหน่วยความจำให้อยู่ในโหนดเดียวกัน) จะช่วยลดเวลาในการเข้าถึงและปรับปรุงอัตราการเข้าถึงแคช ซึ่งเป็นสิ่งสำคัญอย่างยิ่งในการลดความผันผวนและเวลาแฝงที่ไม่สามารถคาดเดาได้

นอกจากนี้ การทำงานร่วมกันระหว่างตัวจัดตารางเวลาของ CPU และระบบย่อย I/O (ดิสก์และเครือข่าย) จะเป็นตัวกำหนดปริมาณงานและเวลาแฝงโดยรวมที่แอปพลิเคชันได้รับ ก่อนทำการเปลี่ยนแปลงใดๆ ควรบันทึกสถานะปัจจุบัน (การกำหนดค่าเคอร์เนล, sysctl, GRUB, โมดูลที่โหลด) เพื่อให้สามารถย้อนกลับได้อย่างรวดเร็วหากการเปลี่ยนแปลงทำให้ประสิทธิภาพแย่ลง

การปรับแต่งผ่าน sysctl เพื่อปรับปรุงความหน่วงและประสิทธิภาพ

อินเทอร์เฟซ sysctl ช่วยให้คุณสามารถแก้ไขพารามิเตอร์ของเคอร์เนลได้ทันทีผ่านทาง /proc/sys โดยไม่ต้องคอมไพล์ใหม่ นับเป็นจุดเริ่มต้นที่เหมาะสำหรับการปรับแต่งโดยไม่ต้องเสียเวลาไปกับการคอมไพล์

ในสภาพแวดล้อมเครือข่าย พารามิเตอร์ต่างๆ เช่นnet.core.rmem_max, net.core.wmem_max และ net.ipv4.tcp_congestion_controlส่งผลโดยตรงต่อปริมาณงาน ความหน่วง และพฤติกรรมการเชื่อมต่อ TCP การปรับบัฟเฟอร์และอัลกอริทึมการจัดการความแออัดอย่างเหมาะสมนั้นมีความสำคัญอย่างยิ่งสำหรับเว็บเซิร์ฟเวอร์ที่มีปริมาณการใช้งานสูงหรืออินสแตนซ์คลาวด์ที่มีความหน่วงต่ำ

สำหรับหน่วยความจำ ค่าต่างๆ เช่นvm.swappiness, vm.dirty_ratio, vm.vfs_cache_pressure และ vm.overcommit_memoryช่วยให้คุณควบคุมปริมาณการใช้ swap วิธีการจัดการ page cache และพฤติกรรมของหน่วยความจำเสมือน การลดค่า swappiness (เช่น เหลือ 10) มักจะช่วยป้องกันไม่ให้ระบบใช้ swap บ่อยเกินไป ลดปัญหาความหน่วงที่เกิดจากการอ่านเขียนดิสก์

หากคุณทำงานกับฐานข้อมูลขนาดใหญ่หรือแอปพลิเคชันที่ใช้หน่วยความจำร่วมจำนวนมหาศาล การปรับค่าkernel.shmmax, kernel.shmallและจำนวนไฟล์ที่เปิดได้สูงสุดโดยใช้fs.file-max และ fs.nr_open นั้นมีความสำคัญอย่างยิ่ง การกำหนด ขีดจำกัดที่ไม่เหมาะสมอาจทำให้เกิดปัญหาคอขวดและข้อผิดพลาดที่วินิจฉัยได้ยากภายใต้ภาระงานหนัก

แนะนำให้ทำการเปลี่ยนแปลงทีละน้อย ตรวจสอบผลกระทบด้วยเครื่องมือตรวจสอบ แล้วจึงค่อยบันทึกการเปลี่ยนแปลงลงในไฟล์ /etc/sysctl.conf หรือ /etc/sysctl.d/ในสภาพแวดล้อมแบบคอนเทนเนอร์ โปรดจำไว้ว่าพารามิเตอร์เคอร์เนลหลายตัวเป็นแบบโกลบอลสำหรับโฮสต์ การแก้ไขที่ไม่ระมัดระวังอาจส่งผลกระทบต่อบริการทั้งหมด ดังนั้นการใช้ sysctl ร่วมกับ cgroups และ namespaces จึงแทบจะเป็นสิ่งที่จำเป็น

การคอมไพล์และการบำรุงรักษาเคอร์เนลแบบกำหนดเอง

การคอมไพล์เคอร์เนลแบบกำหนดเองยังคงเป็นเครื่องมือที่มีประสิทธิภาพเมื่อคุณต้องการลดความหน่วง ลดภาระที่ไม่จำเป็น หรือรองรับฮาร์ดแวร์ที่ผิดปกติแม้ว่าระบบปฏิบัติการต่างๆ จะมีเคอร์เนลที่ค่อนข้างหลากหลาย แต่ในบางสถานการณ์ เคอร์เนลเฉพาะเจาะจงก็สร้างความแตกต่างอย่างมาก

  แปลงแล็ปท็อปเก่าให้เป็นหน้าจอและหน่วยประมวลผลสำหรับเครื่องพิมพ์ 3 มิติ Klipper

ขั้นตอนการทำงานแบบดั้งเดิมเกี่ยวข้องกับการดาวน์โหลดโค้ดจาก kernel.org หรือต้นไม้ที่ได้รับการแก้ไข เช่น xanmod หรือ ลิโคริกซ์และใช้เครื่องมือต่างๆ เช่น make menuconfig เพื่อเลือกตัวเลือกต่างๆ การบันทึกไฟล์ .config ไว้ในที่เก็บ Git ของคุณเอง พร้อมกับสคริปต์การสร้าง จะช่วยให้คุณสามารถสร้างเวอร์ชันซ้ำได้และรักษาความสม่ำเสมอระหว่างเวอร์ชันต่างๆ

หากคุณใช้ Debian หรือระบบปฏิบัติการที่พัฒนาต่อยอดจาก Debian การคอมไพล์ "ตามแบบฉบับ Debian " เพื่อให้ได้แพ็กเกจ .deb ของเคอร์เนล เฮดเดอร์ และไลบรารีที่เกี่ยวข้อง นั้นสะดวกมากวิธีนี้ช่วยให้คุณสามารถใช้งานเคอร์เนลที่ปรับแต่งเองบนเครื่องหลายเครื่องได้ง่ายๆ โดยการติดตั้งแพ็กเกจและจัดการเวอร์ชันด้วยที่เก็บแพ็กเกจของคุณเอง

ในโลกแห่งความเป็นจริง การคอมไพล์ด้วยมือมักจะเหมาะสมกว่าเมื่อทำงานกับฮาร์ดแวร์ที่เก่าหรือมีข้อจำกัดมากตัวอย่างเช่นเน็ตบุ๊กเก่าที่มีซีพียู Atom และแรม 1 GB ซึ่งเคอร์เนลทั่วไปสมัยใหม่ที่เต็มไปด้วยไดรเวอร์ที่ไม่จำเป็นและตัวเลือกระดับเซิร์ฟเวอร์ จะทำให้เกิดความหน่วงและใช้งานซีพียูเพิ่มขึ้นซึ่งคุณไม่สามารถยอมรับได้

กลยุทธ์ทั่วไปคือการเริ่มต้นด้วยการกำหนดค่าเคอร์เนลปัจจุบัน (ตัวอย่างเช่น โดยการคัดลอกไฟล์การกำหนดค่าจาก /boot ) แล้วจึงตัดแต่งหรือปรับแต่ง คุณสามารถเปลี่ยนรูปแบบการแย่งชิงทรัพยากรเป็น " Preemptible Kernel (Low-Latency Desktop) " เพื่อจัดลำดับความสำคัญของการตอบสนองแบบโต้ตอบของเดสก์ท็อป หรือเพิ่มตัวกำหนดตารางเวลา I/O เฉพาะ เช่นBFQเป็นโมดูลเพื่อปรับปรุงประสบการณ์การใช้งานบนฮาร์ดดิสก์แบบกลไก

เพื่อหลีกเลี่ยงการเสียเวลาในการคอมไพล์นานเกินไป ควรสร้างโปรแกรมบนเครื่องที่มีประสิทธิภาพสูงกว่า และหากจำเป็น ให้ใช้การคอมไพล์ข้ามแพลตฟอร์ม (ตัวอย่างเช่น การคอมไพล์เคอร์เนล 32 บิตสำหรับ Atom จากพีซี x86_64 โดยการปรับแต่ง ARCH และชุดเครื่องมือที่เกี่ยวข้อง) จากนั้นคุณเพียงแค่ติดตั้งไฟล์ .deb บนเครื่องเป้าหมายและเพิ่มรายการที่เหมาะสมลงใน GRUB

ส่วนที่ยุ่งยากคือการบำรุงรักษา: แนะนำให้ทดสอบเคอร์เนลใหม่บนโหนดหมู่เกาะคานารีกำหนดเส้นทางการย้อนกลับที่ชัดเจนในตัวจัดการบูต และบันทึกบันทึกและเมตริกในช่วงการเปลี่ยนผ่านเพื่อตรวจจับความถดถอยในประสิทธิภาพหรือความเข้ากันได้ของไดรเวอร์

รูปแบบการแย่งชิงทรัพยากรและแพตช์ PREEMPT_RT สำหรับระบบที่มีความหน่วงต่ำ

รูปแบบการแย่งชิงทรัพยากรของเคอร์เนลจะกำหนดว่างานที่กำลังทำงานอยู่สามารถถูกขัดจังหวะได้มากน้อยเพียงใด เพื่อให้งานที่มีลำดับความสำคัญสูงกว่าสามารถเข้ามาทำงานแทน ซึ่งส่งผลโดยตรงต่อความหน่วงในการตอบสนองรวมถึงตัวเลือกการกำหนดค่ามาตรฐานและการแก้ไขแบบเรียลไทม์ด้วย

เคอร์เนลทั่วไปมีตัวเลือกหลายอย่าง ได้แก่ ไม่มีการแย่งการทำงาน (เน้นที่ประสิทธิภาพของเซิร์ฟเวอร์เป็นหลัก) การแย่งการทำงานโดยสมัครใจ และเคอร์เนลที่สามารถแย่งการทำงานได้สำหรับเดสก์ท็อป ซึ่งให้ความสำคัญกับเวลาตอบสนองที่รวดเร็วสำหรับแอปพลิเคชันแบบโต้ตอบ การปรับการตั้งค่านี้สามารถปรับปรุงประสิทธิภาพของระบบเดสก์ท็อป แอปพลิเคชันเสียง หรือแม้แต่เครื่องเก่าที่มีภาระงานหนักได้อย่างมาก

เมื่อคุณต้องการก้าวไปอีกขั้นแพทช์ PREEMPT และ PREEMPT_RT จะปรากฏขึ้น ซึ่งจะแก้ไขส่วนสำคัญของเคอร์เนลเพื่อลดส่วนที่ไม่สามารถถูกขัดจังหวะได้ให้น้อยที่สุด PREEMPT_RT มีจุดประสงค์สำหรับระบบที่ความหน่วงในกรณีที่เลวร้ายที่สุด (ไม่ใช่แค่ค่าเฉลี่ย) ต้องต่ำมากและคาดการณ์ได้ เช่น ระบบอัตโนมัติทางอุตสาหกรรม ระบบเสียงระดับมืออาชีพ โทรคมนาคม หรือการซื้อขายความถี่สูง

การตัดสินใจนำ PREEMPT_RT มาใช้ไม่ควรขึ้นอยู่กับกระแส แต่ควรพิจารณาจากการวัดค่าความหน่วงและค่าความผันผวนอย่างเป็นรูปธรรมเสียก่อน อันดับแรก ควรศึกษาการตั้งค่าตัวจัดตารางเวลา ความสัมพันธ์ของ CPU sysctl และการกำหนดค่าต่างๆ เช่น dynamic tickless ให้ละเอียดถี่ถ้วนก่อนที่จะทำให้การบำรุงรักษาซับซ้อนขึ้นด้วยโครงสร้าง RT tree

ต้องพิจารณาเรื่องความเข้ากันได้ด้วยเช่นกัน: ไดรเวอร์และระบบย่อยบางส่วนอาจไม่ได้ปรับให้เข้ากับ RT อย่างสมบูรณ์และอาจต้องการเวอร์ชันเฉพาะหรือแพตช์เพิ่มเติม แนวทางที่เหมาะสมคือการจัดทำแผนการบำรุงรักษาที่ระบุอย่างชัดเจนว่าเมื่อใดและอย่างไรจึงจะรวมเวอร์ชันใหม่ของเคอร์เนลหลักเข้ากับสาขา RT ซึ่งมีการซิงโครไนซ์เป็นระยะ แต่ก็ยังล้าหลังอยู่บ้าง

การปรับแต่งการจัดตารางการทำงานของ CPU, การทำงานแบบไร้จังหวะ และการแยกแกนประมวลผล

นอกจากการเลือกรูปแบบการแย่งชิงทรัพยากรแล้ว คุณยังสามารถปรับแต่งความหน่วงแฝงได้โดยการปรับการจัดตารางเวลาของ CPU และพฤติกรรมของตัวจับเวลาเคอร์เนล โดยเฉพาะอย่างยิ่งในระบบปฏิบัติการที่เน้นองค์กร เช่น RHEL

ตัวอย่างเช่น Red Hat Enterprise Linux 8 มาพร้อมกับเคอร์เนลแบบ tickless สำหรับซีพียูที่ไม่ได้ใช้งานซึ่งช่วยลดการใช้พลังงานโดยหลีกเลี่ยงการขัดจังหวะเป็นระยะเมื่อเคอร์เนลไม่ได้ใช้งาน สำหรับเวิร์กโหลดที่ไวต่อความหน่วงแฝงสามารถเปิดใช้งานโหมด tickless แบบไดนามิกบนชุดของเคอร์เนลได้เพื่อให้ซีพียูเพียงตัวเดียว ("เคอร์เนลหลัก") จัดการงานด้านเวลาส่วนใหญ่ และส่วนที่เหลือจะปราศจากการขัดจังหวะเป็นระยะมากที่สุดเท่าที่จะเป็นไปได้

  การย้ายจาก Windows ไปยัง Linux ด้วย ValiuxOS: คู่มือฉบับสมบูรณ์สำหรับการเปลี่ยนระบบ

การตั้งค่านี้ทำได้โดยการเพิ่มพารามิเตอร์ที่เหมาะสมเข้าไป บรรทัดคำสั่งเคอร์เนลใน GRUBสร้างการกำหนดค่าขึ้นใหม่ จากนั้นปรับความสัมพันธ์ของเธรดเคอร์เนลที่สำคัญ เช่น เธรด RCU หรือเธรดอื่นๆ bdi-flushเพื่อให้พวกมันอาศัยอยู่ในส่วนแกนกลางที่สงวนไว้สำหรับการบำรุงรักษา

แนวทางนี้สามารถเสริมด้วย พารามิเตอร์ `isolcpus`ซึ่งช่วยให้สามารถแยกคอร์ออกจากงานปกติในพื้นที่ผู้ใช้ได้ ในสถานการณ์ที่มีความหน่วงต่ำ มักจะสงวนคอร์หลายๆ คอร์ไว้สำหรับแอปพลิเคชันที่สำคัญโดยเฉพาะ ในขณะที่ส่วนที่เหลือของระบบ (เดมอน การขัดจังหวะ ฯลฯ) จะถูกจัดการโดยคอร์อื่นๆ

เพื่อตรวจสอบว่าโหมดไร้จังหวะแบบไดนามิกทำงานได้หรือไม่ สามารถทำการทดสอบง่ายๆ ได้โดยใช้คำสั่งต่อไปนี้ stress หรือสคริปต์ที่ทำให้ CPU ทำงานอยู่ชั่วขณะหนึ่ง แล้วสังเกตผลลัพธ์ด้วย ตัวนับเวลา จำนวนการขัดจังหวะต่อวินาทีลดลงจากหลายพันเหลือเพียงหนึ่งครั้งในคอร์ที่แยกการทำงาน ซึ่งเป็นสัญญาณบ่งชี้ว่าตัวจับเวลาแบบวนรอบได้หายไปแล้ว

การจัดการหน่วยความจำและพื้นที่จัดเก็บข้อมูลโดยเน้นที่ความหน่วงเวลา

วิธีการที่เคอร์เนลจัดการหน่วยความจำและการรับส่งข้อมูลดิสก์มีผลกระทบอย่างมากต่อความหน่วงที่แอปพลิเคชันรับรู้ โดยเฉพาะอย่างยิ่งในฐานข้อมูลและบริการที่ดำเนินการคำสั่งขนาดเล็กจำนวนมากและบ่อยครั้ง

ในส่วนของหน่วยความจำ การลดค่าvm.swappinessจะช่วยลดการใช้งาน swap (ซึ่งโดยส่วนใหญ่แล้วจะช้ากว่า RAM มาก) ค่า vm.vfs_cache_pressureจะควบคุมความเร็วที่ระบบจำเป็นต้องปล่อยแคช inode และ dentry และค่า vm.nr_hugepagesช่วยให้คุณสามารถสำรอง HugePages แบบคงที่สำหรับงานหนัก เช่น ฐานข้อมูลหรือ JVM ซึ่งจะช่วยลดภาระของ TLB

ในการจัดเก็บ ให้เลือก จัดสรรตัวจัดตารางเวลา I/O ที่เหมาะสมตามประเภทของดิสก์ เรื่องนี้สำคัญมาก สำหรับ SSD รุ่นใหม่ๆ ควรใช้... none o mq-deadlineในขณะที่ในฮาร์ดดิสก์แบบกลไกและระบบมัลติทาสก์ อัลกอริทึมที่ออกแบบมาเพื่อความเป็นธรรมอาจทำงานได้ดีกว่า เช่น Bfqนอกจากนี้ ยังสามารถทำการเมานต์ระบบไฟล์ด้วยตัวเลือกต่างๆ เช่น noatime y nodiratime หลีกเลี่ยงการเขียนข้อมูลซ้ำซ้อนทุกครั้งที่มีการเข้าถึงไฟล์หรือไดเร็กทอรี

ในส่วนของระบบไฟล์ext4 และ XFSยังคงเป็นตัวเลือกที่นิยมใช้มากที่สุด: ext4 ที่ปรับแต่งมาอย่างดีนั้นเป็นตัวเลือกที่ปลอดภัย ในขณะที่ XFS มักจะปรับขนาดได้ดีกว่าภายใต้การทำงานพร้อมกันสูง สำหรับสถานการณ์ที่ต้องการประสิทธิภาพสูงมาก การใช้ RAID (RAID 10 สำหรับฐานข้อมูล, RAID 0 สำหรับพื้นที่จัดเก็บข้อมูลชั่วคราว) ร่วมกับตัวจัดตารางเวลาที่ดีสามารถลดเวลาแฝงเฉลี่ยและที่สำคัญที่สุดคือความผันแปรได้

การเพิ่มประสิทธิภาพเครือข่ายและเคอร์เนลเพื่อลดความหน่วงแฝงใน Linux และ EC2

ในแอปพลิเคชันเครือข่ายประสิทธิภาพสูง ความหน่วงไม่ได้ขึ้นอยู่กับฮาร์ดแวร์หรือระยะทางเท่านั้น แต่ยังขึ้นอยู่กับการกำหนดค่าของสแต็ก TCP/IP และเคอร์เนลเองด้วยโดยเฉพาะอย่างยิ่งในระบบคลาวด์ เช่น Amazon EC2 ที่มีอินเทอร์เฟซ ENA

ประการแรก สิ่งสำคัญคือการลดปัจจัยภายนอก เช่น จำนวนการส่งต่อแพ็กเก็ตผ่านเครือข่าย: การใช้โทโพโลยีที่ตรงกว่า ตัวกระจายโหลดที่อยู่ใกล้กับแบ็กเอนด์ หรือโซนความพร้อมใช้งานที่ได้รับการปรับให้เหมาะสม จะช่วยลดเวลาในการเดินทางเป็นมิลลิวินาทีก่อนที่จะถึงระบบปฏิบัติการ

ภายในเคอร์เนล การกำหนดค่าเครือข่ายเกี่ยวข้องกับการเพิ่มจำนวนตัวระบุไฟล์ (ulimit -n)การกำหนดขนาดบัฟเฟอร์รับและส่งด้วยnet.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmem, net.ipv4.tcp_wmemและการเปิดใช้งานตัวเลือกต่างๆ เช่นTCP Fast Openเพื่อลดความหน่วงในการสร้างการเชื่อมต่อ

ในอินเทอร์เฟซ AWS ENA การควบคุมการขัดจังหวะมีบทบาทสำคัญ โดยค่าเริ่มต้น ไดรเวอร์จะจัดกลุ่มแพ็กเก็ตเพื่อลดจำนวน IRQ rx-usecs และ tx-usecsหากคุณต้องการลดความหน่วงให้น้อยที่สุด คุณสามารถปิดการตรวจสอบนี้ได้โดย ethtool -Cการตั้งค่า rx-usecs และ tx-usecs เป็นศูนย์จะช่วยลดความหน่วง แต่จะเพิ่มภาระการทำงานของอินเตอร์รัปต์ ดังนั้นจึงต้องหาจุดสมดุลที่เหมาะสมโดยขึ้นอยู่กับภาระงาน

นอกจากนี้ คุณยังสามารถใช้irqbalance เพื่อกระจาย IRQ ไปยังหลายคอร์หรือปิดใช้งานแล้วตั้งค่าความสัมพันธ์ของอินเตอร์รัปต์และคิวเครือข่าย (RSS/RPS) กับคอร์เฉพาะด้วยตนเอง ซึ่งเป็นเรื่องปกติมากในสภาพแวดล้อมที่มีความหน่วงต่ำมาก หรือเมื่อใช้ DPDK และข้ามส่วนใหญ่ของสแต็กเคอร์เนล

อีกปัจจัยหนึ่งที่ควรพิจารณาคือสถานะ C ของ CPU : สถานะการนอนหลับลึกช่วยลดการใช้พลังงาน แต่จะทำให้เกิดความล่าช้าเมื่อแกนประมวลผล "ตื่นขึ้น" เพื่อลดความหน่วงในการตอบสนอง คุณสามารถจำกัดสถานะการนอนหลับลึกเหล่านี้ได้ โดยยอมรับการใช้พลังงานที่สูงขึ้นและพื้นที่ว่างสำหรับ Turbo Boost ในแกนประมวลผลอื่นๆ น้อยลง สภาพแวดล้อมแต่ละแบบมีจุดที่เหมาะสมที่สุดระหว่างการใช้พลังงานและเวลาที่ได้รับคืนในระดับไมโครวินาที

  การย้ายจาก Linux ไปยัง Ubuntu: การเปลี่ยนแปลงที่ราบรื่น

การเพิ่มประสิทธิภาพ CPU, บริการ และแอปพลิเคชันเพื่อลดความหน่วง

นอกจากตัวเคอร์เนลเองแล้ว สภาพแวดล้อมโดยรอบก็มีส่วนสำคัญต่อความหน่วงโดยรวมเช่นกัน ตั้งแต่บริการที่ทำงานอยู่บนระบบไปจนถึงการกำหนดค่าเฉพาะของแต่ละแอปพลิเคชัน

เซิร์ฟเวอร์ประสิทธิภาพสูงควรใช้งานเฉพาะโปรแกรมต่อไปนี้เท่านั้น ปีศาจที่จำเป็นอย่างแท้จริงบริการต่างๆ เช่น บลูทูธ การพิมพ์ หรือการค้นหาเครือข่ายอัตโนมัติ (CUPS, Avahi ฯลฯ) บนเครื่องแบ็กเอนด์นั้น สิ้นเปลือง CPU หน่วยความจำ และ I/O โดยไม่ก่อให้เกิดประโยชน์ใดๆ (ตรวจสอบโดย...) systemctl list-unit-files --state=enabled และการปิดใช้งานสิ่งที่ไม่จำเป็นนั้นเป็นหนึ่งในวิธีที่ประหยัดและมีประสิทธิภาพที่สุดที่คุณสามารถทำได้

เพื่อจัดลำดับความสำคัญของกระบวนการที่สำคัญ คุณสามารถใช้เครื่องมือต่างๆ เช่นrenice, chrt และ tasksetการปรับลำดับความสำคัญของกระบวนการ (renice) การกำหนดตารางเวลาแบบเรียลไทม์ (chrt -f 99) หรือการกำหนดให้กับคอร์เฉพาะ (taskset) จะช่วยลดการรบกวนกับงานอื่นๆ และปรับปรุงความสามารถในการคาดการณ์การใช้งาน CPU สำหรับฐานข้อมูล VoIP การสตรีมมิ่ง หรือบริการซื้อขายหลักทรัพย์

ในระดับแอปพลิเคชัน การปรับแต่งมีความสำคัญไม่แพ้การปรับแต่งระดับเคอร์เนล เว็บเซิร์ฟเวอร์อย่างNginx หรือ Apacheจำเป็นต้องปรับแต่ง worker, keepalive, cache และ compression อย่างละเอียด ฐานข้อมูลอย่างPostgreSQL หรือ MySQLจำเป็นต้องตรวจสอบขนาดบัฟเฟอร์, checkpoint, connection pool และพารามิเตอร์การเขียนแบบซิงโครนัส เพื่อให้ได้ความหน่วงต่ำและเสถียร

JVM ก็มีบทบาทเช่นกัน: การเลือกตัวจัดการขยะอย่างG1GC หรือ ZGCและการปรับขนาดฮีปสามารถลดช่วงเวลาหยุดชะงักที่ภายนอกอาจดูเหมือนความล่าช้าได้ ในสภาพแวดล้อมเสมือนและคอนเทนเนอร์ การจัดสรรvCPU, vRAM และโควต้า I/O อย่างเหมาะสม จะช่วยป้องกันการแย่งชิงทรัพยากรโดยไม่รู้ตัว ซึ่งต่อมาจะปรากฏเป็นคิวการเข้าถึงดิสก์ที่ไม่สิ้นสุดหรือการโอเวอร์โหลดของ CPU

การตรวจสอบและวัดประสิทธิภาพเคอร์เนลและระบบ

การปรับแต่งทั้งหมดนี้จะไร้ประโยชน์หากคุณไม่วัดผลกระทบ หัวใจสำคัญคือการผสมผสานการตรวจสอบอย่างต่อเนื่องเข้ากับการทดสอบประสิทธิภาพที่สามารถทำซ้ำได้เพื่อให้ทุกการเปลี่ยนแปลงในเคอร์เนลหรือ sysctl สามารถประเมินได้ด้วยข้อมูลที่เป็นกลาง

หากต้องการดูสถานะโดยรวมของระบบ คุณสามารถใช้เครื่องมือแบบดั้งเดิม เช่น htop, vmstat, iotop o sarเมื่อคุณต้องการรายละเอียดเพิ่มเติม เครื่องมือเฉพาะสำหรับเคอร์เนลจะเข้ามามีบทบาท เช่น perf และ ftraceซึ่งช่วยให้คุณสามารถติดตามพฤติกรรมของตัวกำหนดตารางเวลา การขัดจังหวะ และการเรียกใช้ภายในได้อย่างแม่นยำ

ในสภาพแวดล้อมการผลิต ควรติดตั้งระบบวัดประสิทธิภาพ เช่นPrometheus, collectd หรือ sysstat ที่มีตัวส่งออกข้อมูล (exporter)ที่แสดงค่าตัวนับ CPU, I/O, ความหน่วงของดิสก์และเครือข่าย, คิวของกระบวนการ และอื่นๆ การแสดงข้อมูลเหล่านี้ในรูปแบบกราฟิกด้วย Grafana หรือเครื่องมือที่คล้ายกัน จะช่วยตรวจจับความผิดปกติหรือข้อบกพร่องได้ก่อนที่ผู้ใช้ปลายทางจะสังเกตเห็นปัญหา

สำหรับการทดสอบประสิทธิภาพ (benchmarking) แนวคิดคือการจำลองภาระงานจริงและเปรียบเทียบ "ก่อนและหลัง" การเปลี่ยนแปลงแต่ละครั้ง เครื่องมืออย่างsysbench (สำหรับ CPU และฐานข้อมูล), fio (สำหรับดิสก์) หรือiperf3 (สำหรับเครือข่าย) ช่วยให้คุณสร้างสถานการณ์ที่ทำซ้ำได้ จำเป็นอย่างยิ่งที่จะต้องบันทึกเวอร์ชันเคอร์เนล การกำหนดค่า sysctl ฮาร์ดแวร์ และพารามิเตอร์การทดสอบเพื่อให้การเปรียบเทียบมีความหมายในระยะยาว

ในทางปฏิบัติ การปรับแต่งเคอร์เนลของลินุกซ์เป็นกระบวนการแบบวนซ้ำ: คุณทดสอบการปรับแต่งต่างๆ วัดผลลัพธ์ เก็บสิ่งที่ให้ประโยชน์อย่างแท้จริง และทิ้งส่วนที่เหลือ ด้วยการบริหารจัดการการเปลี่ยนแปลงที่ดี คุณสามารถแปลงการปรับปรุงในเวอร์ชันเคอร์เนลใหม่ (เช่น ซีรีส์ล่าสุดที่มีการปรับปรุงด้านตัวจัดตารางเวลา กราฟิก พลังงาน หรือเครือข่าย) ให้เป็นประโยชน์ที่วัดผลได้สำหรับแอปพลิเคชันของคุณ ไม่ว่าจะเป็นเซิร์ฟเวอร์ภายในองค์กร ในคลาวด์ หรือบนเวิร์กสเตชันที่ต้องการประสิทธิภาพสูง

การผสมผสานความรู้ด้านสถาปัตยกรรมเคอร์เนล การปรับแต่งอย่างละเอียดด้วย sysctl การคอมไพล์แบบควบคุม การเลือกใช้แพตช์แบบเรียลไทม์ และระบบการวัดผลที่ดี ช่วยให้ผู้ดูแลระบบหรือทีมปฏิบัติการสามารถตอบสนองได้เร็วขึ้น ลดความหน่วง และเพิ่มเสถียรภาพโดยรวมได้ดียิ่งขึ้นโดยไม่ต้องเปลี่ยนฮาร์ดแวร์เมื่อเกิดปัญหาเล็กน้อย หรือลดทอนความปลอดภัยของระบบ

ลินุกซ์ 6.14-0
บทความที่เกี่ยวข้อง:
Linux 6.14: มีอะไรใหม่ การปรับปรุงด้านความปลอดภัย และการรองรับฮาร์ดแวร์