Linux
น้องๆ เคยสังเกตมั้ยว่าบางทีคอมฯ เรามันอืดๆ หน่วงๆ ทั้งที่สเปคก็ไม่ได้ขี้เหร่อะไร? นั่นแหละครับ สาเหตุหลักๆ เลยก็คือ Kernel (หัวใจของ Linux) มันยังไม่ได้ถูกปรับจูนให้เหมาะกับ Hardware และ Workload ของเราอย่างเต็มที่
Linux Kernel Tuning Performance ก็คือการปรับแต่งค่าต่างๆ ใน Kernel เพื่อให้ระบบทำงานได้เต็มประสิทธิภาพมากขึ้น ดึงศักยภาพของ Hardware ออกมาให้หมด ไม่ว่าจะเป็น CPU, RAM, Storage หรือ Network สมัยผมทำร้านเน็ต SiamCafe เนี่ย เรื่องนี้สำคัญมาก เพราะเครื่องลูกข่ายแต่ละเครื่องต้องทำงานพร้อมกันหลายๆ อย่าง ถ้า Kernel ไม่ดี เครื่องก็ค้าง ลูกค้าก็บ่น
ทำไมมันถึงสำคัญ? ก็เพราะว่าถ้า Kernel มันจูนมาดีแล้ว ทุกอย่างมันจะ smooth ขึ้นเยอะครับ แอปพลิเคชันเปิดเร็วขึ้น, Response time ดีขึ้น, รองรับ User ได้มากขึ้น (สำคัญมากสำหรับ Server), และที่สำคัญคือช่วยประหยัดพลังงานได้ด้วยนะเออ SiamCafe Blog มีบทความเรื่องประหยัดพลังงานเยอะเลย ลองไปอ่านดู
Kernel เนี่ย เปรียบเหมือนผู้จัดการใหญ่ของระบบปฏิบัติการ Linux ครับ ทำหน้าที่ควบคุมทุกอย่าง ตั้งแต่การจัดการ CPU, RAM, Device ต่างๆ ไปจนถึงการติดต่อสื่อสารระหว่าง Hardware กับ Software ถ้าไม่มี Kernel ทุกอย่างก็จบเห่
Process คือโปรแกรมที่กำลังทำงานอยู่ Kernel มีหน้าที่จัดการ Process เหล่านี้ให้ทำงานได้อย่างราบรื่น ไม่ให้ Process ไหนกินทรัพยากรมากเกินไปจน Process อื่นทำงานไม่ได้ สมัยก่อนตอนร้านเน็ตบูมๆ ผมต้องคอยส่อง Process ตลอดเวลาว่ามีตัวไหนแอบกิน CPU หรือ Memory ผิดปกติรึเปล่า
RAM หรือ Memory เป็นทรัพยากรที่สำคัญมาก Kernel ต้องบริหารจัดการ Memory ให้ดี เพื่อให้ Process ต่างๆ สามารถเข้าถึง Memory ได้อย่างรวดเร็วและมีประสิทธิภาพ ถ้า Memory Management ไม่ดี จะเกิดปัญหา Memory Leak หรือ Swapping ซึ่งจะทำให้ระบบช้าลงอย่างเห็นได้ชัด
การ Tuning Kernel มันไม่ใช่เรื่องยากอย่างที่คิดครับ น้องๆ ไม่จำเป็นต้องเป็น Guru Linux ก็ทำได้ เพียงแต่ต้องเข้าใจหลักการพื้นฐานและระมัดระวังในการปรับแต่งเท่านั้นเอง
ขั้นตอนแรกเลยคือ เราต้องรู้จักเครื่องมือที่ใช้ในการ Tuning Kernel ก่อนครับ เครื่องมือที่นิยมใช้กันก็คือ sysctl, tuned และ cpupower แต่ละตัวก็มีหน้าที่แตกต่างกันไป
sysctl เป็น Command-line tool ที่ใช้ในการอ่านและแก้ไข Kernel parameters แบบ Dynamic (ไม่ต้อง Reboot) เราสามารถใช้ sysctl -a เพื่อดูค่า Parameter ทั้งหมดได้
sysctl -a | less
การแก้ไขค่า Parameter ก็ทำได้ง่ายๆ โดยใช้ sysctl -w parameter=value เช่น
sysctl -w vm.swappiness=10
คำสั่งนี้จะเปลี่ยนค่า vm.swappiness เป็น 10 (ค่า Default คือ 60) ค่านี้มีผลต่อการ Swapping ถ้าตั้งค่าน้อย จะ Swapping น้อยลง ทำให้ระบบตอบสนองเร็วขึ้น แต่ต้องระวังว่าถ้า RAM ไม่พอ อาจจะเกิดปัญหา Out of Memory ได้
เพื่อให้ค่า Parameter ที่เราแก้ไขมีผลถาวร เราต้องเพิ่มค่า Parameter เหล่านั้นลงในไฟล์ /etc/sysctl.conf หรือไฟล์ใน Directory /etc/sysctl.d/
tuned เป็น Service ที่ช่วยในการปรับแต่ง Kernel Parameters โดยอัตโนมัติ โดยอิงตาม Profile ที่เราเลือก เช่น throughput-performance สำหรับ Server ที่ต้องการ Throughput สูง หรือ latency-performance สำหรับ Application ที่ต้องการ Response time ต่ำ
การใช้งาน tuned ก็ง่ายๆ ครับ แค่ Install package tuned แล้วเลือก Profile ที่ต้องการ
yum install tuned # สำหรับ CentOS/RHEL
apt install tuned # สำหรับ Ubuntu/Debian
tuned-adm profile throughput-performance
tuned จะจัดการปรับแต่ง Kernel Parameters ให้เราเอง โดยที่เราไม่ต้องทำอะไรมาก
cpupower เป็น Tool ที่ใช้ในการจัดการ CPU Frequency Scaling และ Power Saving Modes เราสามารถใช้ cpupower frequency-info เพื่อดูข้อมูลเกี่ยวกับ CPU Frequency ของเราได้
cpupower frequency-info
การปรับ CPU Frequency Scaling สามารถทำได้โดยใช้ cpupower frequency-set เช่น
cpupower frequency-set -g performance
คำสั่งนี้จะตั้ง CPU Governor เป็น performance ซึ่งจะทำให้ CPU ทำงานที่ Frequency สูงสุดตลอดเวลา เหมาะสำหรับ Application ที่ต้องการ Performance สูง
แต่ต้องระวังว่าการตั้ง CPU Frequency สูงตลอดเวลาจะทำให้ CPU ร้อนขึ้นและกินไฟมากขึ้น ดังนั้นควรใช้ cpupower อย่างระมัดระวัง
นอกจากวิธีที่กล่าวมาแล้ว ยังมีทางเลือกอื่นๆ ในการปรับแต่ง Kernel Performance อีก เช่น
แต่ทางเลือกเหล่านี้ก็มีข้อเสีย คือต้องใช้ความรู้และประสบการณ์มากกว่า และอาจจะทำให้ระบบไม่เสถียร
ลองดูตารางเปรียบเทียบกันครับ
| วิธี | ข้อดี | ข้อเสีย | ความยาก |
|---|---|---|---|
| sysctl | ง่าย, ปรับแต่งได้ละเอียด | ต้องมีความรู้เรื่อง Kernel Parameters | ปานกลาง |
| tuned | ง่าย, ปรับแต่งอัตโนมัติ | ปรับแต่งได้ไม่ละเอียดเท่า sysctl | ง่าย |
| cpupower | จัดการ CPU Frequency ได้ | ต้องระวังเรื่องความร้อนและพลังงาน | ปานกลาง |
| Real-time Kernel | Latency ต่ำ | อาจไม่เสถียร, ต้อง Compile เอง | ยาก |
| Custom Kernel | Performance สูง, ขนาดเล็ก | ต้อง Compile เอง, ใช้เวลานาน | ยาก |
| Distribution ที่จูนมาแล้ว | ง่าย, ได้ Performance ที่ดีตั้งแต่ต้น | อาจไม่เหมาะกับทุก Workload | ง่าย |
สรุปคือ การ Tuning Kernel Performance เป็นเรื่องที่ต้องใช้ความรู้และประสบการณ์ แต่ก็สามารถทำได้ไม่ยาก ถ้าน้องๆ เข้าใจหลักการพื้นฐานและรู้จักเครื่องมือที่ใช้ ก็สามารถปรับแต่ง Kernel ให้เหมาะสมกับ Hardware และ Workload ของตัวเองได้ครับ ลองไปศึกษาเพิ่มเติมจาก SiamCafe Blog หรือแหล่งความรู้อื่นๆ ดูนะครับ
ดูวิดีโอเพิ่มเติมเกี่ยวกับLinux Kernel Tuning Performanc:
เอาล่ะ มาถึงส่วนที่สำคัญที่สุดแล้ว เคล็ดลับที่ผมสั่งสมมาตลอด 20 กว่าปี ในวงการนี้ บอกเลยว่าแต่ละอย่างนี่ "ของจริง" ไม่ใช่ทฤษฎีที่อ่านจากในเน็ตมา
สมัยผมทำร้านเน็ต SiamCafe เนี่ย เจอปัญหามาทุกรูปแบบ ตั้งแต่เครื่องแฮงค์เพราะแรมไม่พอ ไปจนถึงเน็ตหลุดเพราะ Kernel Panic (อันหลังนี่ตัวดีเลย)
จำไว้เลยนะ Swappiness คือตัวกำหนดว่า Kernel จะเริ่มโยกข้อมูลจาก RAM ไปลง Harddisk (Swap Space) เมื่อไหร่ ค่า default ส่วนใหญ่คือ 60 ซึ่ง...เยอะไป! โดยเฉพาะเครื่องที่มี RAM เยอะๆ
ถ้า RAM เหลือน้อย Kernel จะ swap บ่อยเกินไป ทำให้เครื่องอืดเป็นเรือเกลือ ผมแนะนำให้ปรับลงมาเหลือ 10 หรือ 0 เลยก็ได้ (ถ้า RAM เยอะจริงๆ)
sysctl vm.swappiness=10
แต่ระวัง! ถ้า RAM น้อยเกินไป แล้วตั้ง Swappiness เป็น 0 เครื่องอาจจะ OOM (Out of Memory) แล้ว Kernel จะ kill process ทิ้งเลยนะ
สองตัวนี้สำคัญมากสำหรับการเขียนข้อมูลลง Disk Dirty Ratio คือ เปอร์เซ็นต์ของ RAM ที่ Kernel ยอมให้เป็น "ข้อมูลที่ยังไม่ได้เขียนลง Disk" ส่วน Background Ratio คือ เปอร์เซ็นต์ที่ Kernel จะเริ่มเขียนข้อมูลลง Disk "เบื้องหลัง" (ในขณะที่ process อื่นยังทำงานอยู่)
ค่า default มักจะไม่ค่อยดีเท่าไหร่ ทำให้เกิดอาการ "รอเขียนข้อมูล" บ่อยๆ ยิ่งถ้าใช้ Harddisk รุ่นเก่า (ไม่ใช่ SSD) นี่เห็นผลชัดเจน
sysctl vm.dirty_ratio=20
sysctl vm.dirty_background_ratio=10
ลองปรับดู แต่อย่าตั้ง Dirty Ratio สูงเกินไป เพราะถ้าไฟดับ ข้อมูลที่ยังไม่ได้เขียนลง Disk จะหายหมดนะ
อันนี้สำหรับ Server ที่ต้อง maintain connection นานๆ เช่น Web Server หรือ Game Server TCP Keepalive คือ กลไกที่ Kernel จะส่ง packet เล็กๆ ไปเช็คว่า connection ยัง "มีชีวิต" อยู่รึเปล่า
ถ้าไม่มี Keepalive Connection ที่ idle นานๆ อาจจะถูก Router ตัดทิ้ง ทำให้ client ต้อง connect ใหม่
sysctl net.ipv4.tcp_keepalive_time=7200 # 2 hours
sysctl net.ipv4.tcp_keepalive_intvl=75 # 75 seconds
sysctl net.ipv4.tcp_keepalive_probes=9 # 9 probes before drop
ปรับเวลาให้เหมาะสมกับ Application ของเรา ลอง search เพิ่มเติมดูนะ
ถ้าใช้ SSD เป็น Disk หลัก ให้เปลี่ยน I/O Scheduler เป็น noop เลย เพราะ SSD ไม่ต้อง optimize เรื่องการเคลื่อนที่ของหัวอ่านเหมือน Harddisk scheduler ตัวอื่นอาจจะทำให้ SSD ทำงานช้าลง
วิธีเช็คว่าใช้อะไรอยู่:
cat /sys/block/sda/queue/scheduler
วิธีเปลี่ยน (ต้องทำตอน boot): แก้ /etc/default/grub เพิ่ม elevator=noop แล้ว update grub
บาง parameter ปรับได้เลยด้วย sysctl แต่บาง parameter ต้องแก้ config file แล้ว reboot เพราะมันถูกอ่านตอน boot เท่านั้น
ถ้าแก้ config file แล้วบูตไม่ขึ้น ให้เข้า Recovery Mode แล้วแก้ config file กลับเป็นค่าเดิม ถ้าปรับด้วย sysctl ก็แค่ reboot เครื่องมันก็จะกลับเป็นค่า default
ขึ้นอยู่กับ workload ของคุณ! ไม่มีสูตรสำเร็จตายตัว ต้องลองผิดลองถูก ปรับไปดู performance ไป (แต่ก่อนปรับ Backup ไว้ก่อนนะ)
Documentation ของ Kernel (kernel.org) เป็นแหล่งข้อมูลที่ดีที่สุด แต่ต้องอ่านเยอะหน่อย นอกจากนี้ก็มี Forum ต่างๆ ที่เกี่ยวกับ Linux ลอง search ดู
การปรับแต่ง Linux Kernel เป็นศาสตร์และศิลป์ ต้องใช้ประสบการณ์และความเข้าใจ แต่ผลลัพธ์ที่ได้คุ้มค่าแน่นอน ลองเอาเคล็ดลับที่ผมบอกไปปรับใช้ดู แล้วคุณจะเห็นว่า Linux ของคุณ "แรง" ขึ้นได้อีกเยอะ
อย่าลืม Backup ข้อมูลก่อนปรับแต่ง และศึกษาข้อมูลให้ดีก่อนลงมือทำนะครับ ขอให้สนุกกับการ Tuning Kernel!
ถ้าอยากได้ความรู้เรื่อง IT แบบเข้มข้น SiamCafe Blog มีบทความดีๆ อีกเพียบ
หรือถ้าสนใจลงทุนในตลาด Forex ลองดู iCafeForex