天天看點

資料庫伺服器作業系統,資料庫伺服器之作業系統優化

1 關閉透明大頁面

透明大頁會導緻oracle節點重新開機和其他問題,對rac和單機都有效

透明大頁的預設設定,首先檢視透明大頁是否啟用,[always] never表示已啟用,always [never]表示已禁用

# cat /sys/kernel/mm/transparent_hugepage/enabled

[always] never  #啟用

or

cat /sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

# grep AnonHugePages /proc/meminfo

AnonHugePages:      6144 kB

修改方法:

1.vi /etc/grub.conf  添加粗體

title Oracle Linux Server(2.6.32-300.25.1.el6uek.x86_64)

root (hd0,0)

kernel/vmlinuz-2.6.32-300.25.1.el6uek.x86_64 ro root=LABEL=/  transparent_hugepage=never

initrd /initramfs-2.6.32-300.25.1.el6uek.x86_64.img

2.vi /etc/rc.local   添加下面的代碼

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then

echo never >/sys/kernel/mm/transparent_hugepage/enabled

fi

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then

echo never >/sys/kernel/mm/transparent_hugepage/defrag

fi

the two methods need the syste reboot,and then you can use the following line to identify

# grep AnonHugePages /proc/meminfo

AnonHugePages:         0 kB

# cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

2、關閉numa

檢視目前numa的節點情況:

numactl --hardware

檢視目前系統numa政策:

numactl --show

因為numa預設的記憶體配置設定政策是優先在程序所在CPU的本地記憶體中配置設定,會導緻CPU節點之間記憶體配置設定不均衡,

當某個CPU節點記憶體不足時,會導緻swap産生,而不是從遠端節點配置設定記憶體,這就是swap insanity現象。

MySQL伺服器為什麼需要關閉numa?

MySQL是單程序多線程架構資料庫,當numa采用預設記憶體配置設定政策時,MySQL程序會被并且僅僅會被配置設定到numa的一個節點上去。

假設這個節點的本地記憶體為10GB,而MySQL配置20GB記憶體,超出節點本地記憶體部分(20GB-10GB)Linux會使用swap而不是使用其他節點的實體記憶體。

在這種情況下,能觀察到雖然系統總的可用記憶體還未用完,但是MySQL程序已經開始在使用swap了。

如果單機隻運作一個MySQL執行個體,可以選擇關閉numa,關閉nuam有兩種方法:

1.硬體層,在BIOS中設定關閉;

2.OS核心,啟動時設定numa=off。

修改/etc/grub.conf檔案,在kernel那行追加numa=off;

儲存後重新開機伺服器,再次檢查numa隻剩下一個節點就成功了:

# numactl --hardware

available: 1 nodes (0)

node 0 cpus: 0

node 0 size: 2047 MB

node 0 free: 1514 MB

node distances:

node   0

0:  10

Oracle 11g檢視numa有關的參數:SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ

FROM SYS.x$ksppi x, SYS.x$ksppcv y

WHERE x.inst_id = USERENV ('Instance')

AND y.inst_id = USERENV ('Instance')

AND x.indx = y.indx

AND upper(x.ksppinm) like '%NUMA%';

NAME  VALUE   DESCRIB

---------------------------------------- ---------------------------------------- ----------------------------------------

_rm_numa_sched_enable      FALSE            Is Resource Manager (RM) related NUMA scheduled policy enabled

_NUMA_pool_size            Not specified    aggregate size in bytes of NUMA pool

_enable_NUMA_optimization  TRUE             Enable NUMA specific optimizations

_NUMA_instance_mapping     Not specified    Set of nodes that this instance should run on

_rm_numa_simulation_pgs    0                number of PGs for numa simulation in resource manager

_rm_numa_simulation_cpus   0                number of cpus per PG for numa simulation in resource manager

_db_block_numa             2                Number of NUMA nodes

三、選擇deadline為預設的IO排程政策

IO排程政策有btrfs cfq, noop, deadline三

Deadline(截止時間排程程式)

特點:

通過時間以及硬碟區域進行分類,這個分類和合并要求類似于noop的排程程式.

Deadline確定了在一個截止時間内服務請求,這個截止時間是可調整的,而預設讀期限短于寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象.

Deadline對資料庫環境(ORACLE RAC,MYSQL等)是最好的選擇.

在不同場景下選擇不同的IO排程器:

在完全随機通路環境下,由于CFQ可能會造成小IO的相應延時增加,是以應設定為deadline,這樣更穩定。

對于SSD裝置,采用NOOP或者deadline也可以擷取比預設排程器更好的性能。

檢視目前系統支援的IO排程算法:

#  dmesg|grep -i scheduler

[    1.936159] io scheduler noop registered

[    1.936161] io scheduler deadline registered (default)

[    1.936178] io scheduler cfq registered

修目前塊裝置(/dev/sda)使用的IO排程算法,修改IO排程算法後直接生效:

echo "deadline">> /sys/block/sda/queue/scheduler

永久修改IO排程算法,可以通過修改核心引導參數,增加elevator=排程算法:

kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=UUID=28d9f713-f49d-49ae-9e63-401986d11ab2 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet numa=off elevator=deadline transparent_hugepage=never

驗證:

重新開機之後,檢視排程方法:

cat /sys/block/sda/queue/scheduler

4、交換分區設定

swappiness是Linux的一個核心參數,使用者控制Linux實體記憶體進行swap頁交換的相對權重,盡量減少系統的頁緩存被從記憶體中清除的情況。取值範圍是0~100,vm.swappiness的值越低,Linux核心會盡量不進行swap交換頁的操作,vm.swappiness的值越高,Linux會越多的使用swap空間。Linux系統預設值是60,當系統需要記憶體時,有60%的機率使用swap。對于大多數桌面系統,設定為100可以提高系統的整體性能;對于資料庫應用伺服器,設定為0,可以提高實體記憶體的使用率,進而提高資料庫服務的響應性能。

# vim /etc/sysctl.conf

vm.swappiness=0

sysctl -p 生效

# sysctl -a|grep swap

vm.swappiness = 0