Thứ Năm, 9 tháng 1, 2020

Bí quyết thiết lập tham số hugepages cho CSDL Oracle trên Linux

Mục đích: Với Oracle Database chạy Linux Server từ 16GB SGA (mà chỉ cần >=8GB) thì nên sử dụng HugePages. Khi đó Oracle sẽ hoạt đọng hiệu quả hơn. Khi chúng ta cấu hình HugePage, Linux Kernel sẽ dùng page hớn (gọi là huge page). Thay vì 4K với Linux x86 và x86_64 hay 16 KB với IA64 chúng ta sẽ đặt  4 MB on x86, 2MB với x86_64 hay 256MB trên IA64. Page lớn hơn tức là hệ thống sẽ cần ít bảng quản lý page (page table) hơn, do đó việc ánh xạ giữa page table và block cần truy xuất.
Tuy nhiên giới hạn của Oracle là tính năng AMM (Automatic Memory Management) không hỗ trợ HugePages. Do đó AMM disable (memory_max_size = 0, memory_target=0) và thay bằng ASMM (Automatic Shared Memory Management), tức là cấu hình SGA_MAX_SIZE, SGA_TARGET.

Bước 1: Thiết lập tham số memlock trong file /etc/security/limits.conf để giới hạn khả năng sử dụng RAM của user, ví dụ hệ thống có 64GB RAM thì thiết lập tối đa 90% của RAM tính theo KB.
# vi /etc/security/limits.conf
*   soft   memlock    60397977
*   hard   memlock    60397977

Kiểm tra lại :
(oracle)$ ulimit -l

Bước 2:Disable AMM

 Với Oracle Database từ 11g trở đi thì disable AMM bằng các  tham số MEMORY_TARGET và MEMORY_MAX_TARGET (nếu có).
ALTER SYSTEM SET MEMORY_TARGET = 0 SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET = 0 SCOPE=SPFILE;

Bước 3: Thiết lập lại giá trị SGA cho Oracle DB (memory 90% tức là 57.6GB, SGA 80% tức 46GB còn lại 11.6GB cho PGA).
ALTER SYSTEM SET SGA_TARGET = 46G ;
ALTER SYSTEM SET SGA_MAX_SIZE = 46G ;

Bước 4: Restart DB.
Nếu không thay đổi tham số SGA_MAX_SIZE thì không cần phải làm bước này.

Bước 5: Tính toán và thiết lập giá trị hugepages.
Tính bằng tay:
- Kiểm tra Hugepagesize
grep Hugepagesize /proc/meminfo

Hugepagesize:       2048 kB
- Tính vm.nr_hugepages = SGA/Hugepagesize = 46*1024*1024/2048=23552
Hoặc Chạy script hugepages_settings.sh (từ My Oracle Support (MOS) note 401749.1).) để tính toán ra giá trị hugepages cần thiết lập. Giả sử giá trị cần đặt ở đây là 22960.
#!/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  
$ chmod u+x ./hugepages_setting.sh  
$ ./hugepages_settings.sh
.
.
.
Recommended setting: vm.nr_hugepages = 23552

Bước 6: Từ root, Sửa file /etc/sysctl.conf và thiết lập tham số vm.nr_hugepages theo giá trị tính toán ở trên:
vm.nr_hugepages = 23552


Bước 7:  Shutdown tất cả các DB instance và reboot server 

hoặc không cần reboot thì thực hiện # sysctl -p

Bước 8: Kiểm tra lại cấu hình.
Sau khi server và DB lên, kiểm tra lại cấu hình xem có chuẩn không.
# grep HugePages /proc/meminfo
HugePages_Total:    23552
HugePages_Surp:        0

# grep ^Huge /proc/meminfo
HugePages_Total:   23552
HugePages_Free:    10552
HugePages_Rsvd:     2016
HugePages_Surp:        0
Hugepagesize:       2048 kB

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master