วันศุกร์ที่ 21 พฤศจิกายน พ.ศ. 2557

วิธี Implement HugePages บน Linux

สวัสดีครับ
เรามาทำความรู้จักกับ HugePages ก่อนว่าเป็นอย่างไรครับ

มันคือฟีเจอร์ตัวนึงที่มีอยู่ใน Linux kernel 2.6 โดยฟีเจอร์นี้จะทำให้เราสามารถใช้ Memory page size ได้ใหญ่กว่าปกติ (4K) นั่นเอง และมันยังสามารถใช้ได้ทั้ง 32bit กับ 64bit ได้อีกด้วยครับ

คำศัพท์ :
- Page Table : คือ Data structure ของ Virtual memory system ในระบบปฏิบัติการเพื่อเก็บการทำ mapping ระหว่าง virtual address กับ physical address นี้หมายถึงบน Virtual memory system
Memory จะถูก accessed โดยการ access ที่ Page table แล้วถึงจะ access พื้นที่บน memory จริงๆ
- TLB : ย่อมาจาก Translation Lookaside Buffer คือ buffer (หรือ cache) ใน CPU ที่ประกอบไปด้วยส่วนต่างๆของ Page Table จะมีขนาดคงที่ในขณะที่ถูกใช้เพื่อทำ virtual address translation ได้เร็วขึ้น

สิ่งที่ควรรู้ :
- เราสามารถปรับจำนวนของ HugePages ได้โดยไม่ต้องรีสตาร์ทเครื่องใหม่ แต่ในครั้งแรกที่เรา Config มันเราจำเป็นต้องรีสตาร์ทเครื่องเพื่อให้ระบบทำการจองไว้ตั้งแต่เริ่มสตาร์ทอัพ

- HugePages sizes สามารถมีได้หลายขนาดตั้งแต่ 2MB จนถึง 256MB ขึ้นอยู่กับ Kernel version กับ Hardware Architecture


ประโยชน์ของ HugePages :
- มันไม่ใช้ Swap จึงไม่ต้องกังวลเกี่ยวกับกลไก page-in/page-out  , HugePages จะเป็นการปักหมุดเอาไว้บน Physical Memory
- ใช้ TLB น้อยลง
   -- HugePages ใช้จำนวน pages น้อยกว่าในการครอบคลุมพื้นที่ Physical address
   -- TLB entries จะครอบคลุมพื้นที่ส่วนใหญ่เมื่อใช้ HugePages นั่นคือจะมี TLB เพียงเล็กน้อยที่ขาดหายไปก่อนที่ทั้งหมดหรือส่วนใหญ่ของ SGA จะถูกแมปใน SGA
   -- TLB entries น้อยกว่าสำหรับ SGA นั้นหมายถึงจะมีพื้นที่สำหรับส่วนอื่นๆมากขึ้นด้วย
- ขจัด Page Table lookup overhead
- ประสิทธิภาพโดยรวมของ Memory จะดีขึ้น  บน Virtual Memory System การทำงานของ Memory แต่ละครั้งจะถูกแบ่งการทำงานจริงๆเป็น 2 การทำงาน เมื่อ HugePages ใช้จำนวน pages เพียงเล็กน้อย โอกาสที่จะเกิด bottleneck ของการ access page table จะหายไป
- Page size ขนาดใหญ่และใช้จำนวน Page น้อยกว่า นั้นคือ Default page size คือ 4K แต่ว่า HugePages คือ 2048K นี้หมายถึงระบบจะลดจำนวนการ handle pages ลงไปถึง 512 เท่า
- Reduced Page Table Walking ตั้งแต่ HugePages ครอบคลุม virtual address range ได้ต่อเนื่องกันมากกว่า โอกาสของ TLB hit per TLB entry ก็จะสูงกว่าด้วย สิ่งนี้จะทำให้ access physical address ได้เร็วขึ้นโดยลดจำนวน page tables ที่ต้องเดินข้ามผ่านเพื่อหา physical address จาก virtual address
- ใช้ Memory น้อยกว่า จากมุมมองของ Oracle Database กับ HugePages คือ Linux kernel จะใช้ memory น้อยกว่าในการสร้าง page tables เพื่อเก็บเส้นทาง mapping ระหว่าง virtual สู่ physical สำหรับ พื้นที่ SGA เมื่อเปรียบเทียบกับ page size แบบปกติที่ใช้ memory มากกว่าเพื่อ available สำหรับ process-private หรือการใช้ PGA


Size ของ HugePages
ขึ้นอยู่กับ
- Kernel version / Linux distribution
- Hardware Platform
เราสามารถดู size ของ HugePages ที่เครื่องเราได้ด้วยคำสั่ง :
grep Hugepagesize /proc/meminfo


HugePages Reservation
ฟีเจอร์นี้ถูก implement อย่างสมบูรณ์ที่ kernel 2.6.17 ดังนั้น EL5 (based on 2.6.18) จะมีฟีเจอร์นี้ด้วย
ฟีเจอร์นี้จะทำให้ Oracle Database สามารถ allocate hugepages สำหรับ sublevels ของ SGA ได้ตามต้องการ


HugePages and Oracle 11g Automatic Memory Management (AMM)
AMM และ HugePages ไม่ compatible กัน เราต้อง Disable AMM เพื่อจะสามารถใช้ HugePages ได้


สิ่งที่เกิดขึ้นเมื่อจำนวน HugePages ไม่เพียงพอ?
- HugePages จะไม่ถูกใช้ (HugePages_Total = HugePages_Free)
- ประสิทธิภาพในการทำงานของ Database ลดลง
- System จะรัน out of memory หรือเกิด swap มาก
- Database Instance บางตัวอาจไม่สามารถ startup ขึ้นได้

USE_LARGE_PAGES initialization parameter จะช่วย manage SGAs ให้ใช้ HugePages เท่านั้นและจะแจ้ง warning หรือ ทำให้ไม่สามารถ startup ขึ้นได้ถ้ามันไม่สามารถใช้ hugepages เหล่านั้นได้


วิธีการ Configure
Step 1 : เซต memlock user limit ใน /etc/security/limits.conf เซตค่าเป็น KB ให้น้อยกว่าจำนวน Memory เล็กน้อยเช่นมี RAM 64GB เราอาจเซตเป็น
*    soft    memlock    60397977
*    hard   memlock    60397977

*ไม่มีผลเสียใดๆถ้าหากเราจะเซตค่านี้เกินกว่า SGA ที่เราต้องการ

Step 2 : Re-logon OS ใหม่โดยเข้า Account ที่เป็นเจ้าของ Oracle Software เช่น 'oracle' และเช็ค memlock limit
$ ulimit -l
60397977


Step 3 : ถ้าเราใช้ Oracle Database 11g หรือใหม่กว่า Default ของ Database จะใช้ AMM ดังนั้นเราต้องปิดการใช้งาน AMM ก่อนด้วยการเซต MEMORY_TARGET และ MEMORY_MAX_TARGET เป็น 0
ORA-00845: MEMORY_TARGET not supported on this system

Step 4 : เพื่อความชัวร์เมื่อเรา Disable AMM แล้ว (ใช้ ASMM หรือเซต memory components แต่ละตัว) เราสามารถรันสคริปต์ hugepages_setting.sh เพื่อดูจำนวน hugepages ที่จะเซต

#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
do
   MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
   if [ $MIN_PG -gt 0 ]; then
      NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
   fi
done
# Finish with results
case $KERN in
   '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
          echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
   '2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    *) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End
 
 
$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 1496
$ 

Step 5 : เพิ่ม parameter vm.nr_hugepages ลงไปในไฟล์ /etc/sysctl.conf
vm.nr_hugepages = 1496
(อาจบวกเพิ่มเข้าไปซัก 2-3 pages)

Step 6 : Stop all database instances and reboot the server
 
Step 7 : หลังจาก reboot เสร็จแล้วให้เปิด Database ขึ้นมา 
(เพื่อให้แน่ใจว่า Database Instances จะใช้ HugePages ตลอดแน่นอนให้เซตค่า use_large_pages = ONLY ไว้ที่ Database นั้น)
 
Step 8 : เราสามารถเช็คได้ว่า HugePages ถูกใช้หรือไม่
# grep HugePages /proc/meminfo
HugePages_Total: 1496
HugePages_Free: 485
HugePages_Rsvd: 446
HugePages_Surp: 0

เพื่อให้แน่ใจว่า HugePages ได้ถูกใช้  HugePages_Free ควรมีค่าน้อยกว่า HugePages_Total
 
 
Ref : Oracle Support (Doc ID 361323.1)

1 ความคิดเห็น: