NUMA架構的優缺點


numa把一台計算機分成多個節點(node),每個節點內部擁有多個CPU,節點內部使用共有的內存控制器,節點之間是通過互聯模塊進行連接和信息交互。
因此節點的所有內存對於本節點所有的CPU都是等同的,對於其他節點中的所有CPU都不同。因此每個CPU可以訪問整個系統內存,但是訪問本地節點的內存速度
最快(不經過互聯模塊),訪問非本地節點的內存速度較慢(需要經過互聯模塊),即CPU訪問內存的速度與節點的距離有關,該距離成為Node Distance。
查看當前numa的節點情況:
numactl --hardware

節點之間的距離(Node Distance)指從節點1上訪問節點0上的內存需要付出的代價的一種表現形式。
Numa內存分配策略有一下四種:
缺省default:總是在本地節點分配(當前進程運行的節點上)。
綁定bind:強制分配到指定節點上。
交叉interleavel:在所有節點或者指定節點上交叉分配內存。
優先preferred:在指定節點上分配,失敗則在其他節點上分配。
查看當前系統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;
[root@node130 ~]#  vim /boot/grub/grub.conf
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=UUID=cb7d8bdc-28a5-4dbd-b04a-3ad9ee3e6bba 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
保存后重啟服務器,再次檢查numa只剩下一個節點就成功了:
[root@node130 ~]# 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

IO調度
在不同場景下選擇不同的IO調度器:
在完全隨機訪問環境下,由於CFQ可能會造成小IO的相應延時增加,所以應設置為deadline,這樣更穩定。
對於SSD設備,采用NOOP或者deadline也可以獲取比默認調度器更好的性能。
查看當前系統支持的IO調度算法:
[root@node130 Desktop]# dmesg|grep -i scheduler
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
查看當前設備(/dev/sda)使用的IO調度算法:
[root@node130 Desktop]# cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

修當前塊設備(/dev/sda)使用的IO調度算法,修改IO調度算法后直接生效:
echo "deadline">> /sys/block/sda/queue/scheduler

永久修改IO調度算法,可以通過修改內核引導參數,增加elevator=調度算法:
vim /boot/grub/menu.lst
kernel /boot/                                root=LABEL=/ elevator=deadline

[root@node130 Desktop]# vim /etc/grub.conf

title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
        root (hd0,0)
        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

交換分區

swappiness是Linux的一個內核參數,用戶控制Linux物理內存進行swap頁交換的相對權重,盡量減少系統的頁緩存被從內存中清除的情況。取值范圍是0~100,vm.swappiness的值越低,Linux內核會盡量不進行swap交換頁的操作,vm.swappiness的值越高,Linux會越多的使用swap空間。Linux系統默認值是60,當系統需要內存時,有60%的概率使用swap。對於大多數桌面系統,設置為100可以提高系統的整體性能;對於數據庫應用服務器,設置為0,可以提高物理內存的使用率,進而提高數據庫服務的響應性能。

[root@node130 ~]# vim /etc/sysctl.conf 
vm.swappiness=0

sysctl -p 生效
[root@node130 ~]# sysctl -a|grep swap
vm.swappiness = 0

 

NUMA特性禁用

 
一、檢查OS是否開啟NUMA
# numactl --hardware
二、Linux OS層面禁用NUMA
1、修改 grub.conf
# vi /boot/grub/grub.conf
#/* Copyright 2010, Oracle. All rights reserved. */
 
default=0
timeout=5
hiddenmenu
foreground=000000
background=ffffff
splashimage=(hd0,0)/boot/grub/oracle.xpm.gz
 
title Trying_C0D0_as_HD0
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-128.1.16.0.1.el5 root=LABEL=DBSYS ro bootarea=dbsys rhgb quiet console=ttyS0,115200n8 console=tty1 crashkernel=128M@16M numa=off
initrd /boot/initrd-2.6.18-128.1.16.0.1.el5.img
 
2、重啟Linux操作系統
# /sbin/reboot
 
3、確認OS層面禁用NUMA是否成功
# cat /proc/cmdline
root=LABEL=DBSYS ro bootarea=dbsys rhgb quiet console=ttyS0,115200n8 console=tty1 crashkernel=128M@16M numa=off
# numactl --hardware
 
三、SuSE Linux禁用NUMA示例
對於suse系統來說,只要不重新編譯內核,系統默認是啟用numa功能的(可以通過/boot/config-`uname -r`查看)。
嘗試在/boot/grub/menu.lst文件中kernel一行的選項中添加 numa=off 參數禁止numa功能,重啟系統生效。
# more /boot/grub/menu.lst
# Modified by YaST2. Last modification on Mon Dec 23 23:19:15 CST 2013
default 0
timeout 8
##YaST - generic_mbr
gfxmenu (hd0,7)/message
##YaST - activate
 
###Don't change this comment - YaST2 identifier: Original name: linux###
title SUSE Linux Enterprise Server 11 SP1 - 2.6.32.59-0.7
  root (hd0,7)
  kernel /vmlinuz-2.6.32.59-0.7-default root=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part2 resume=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part1 splash=silent crashkernel=256M-:128M showopts vga=0x31a elevator=deadline numa=off
  initrd /initrd-2.6.32.59-0.7-default
 
###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- SUSE Linux Enterprise Server 11 SP1 - 2.6.32.59-0.7
  root (hd0,7)
  kernel /vmlinuz-2.6.32.59-0.7-default root=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part2 showopts ide=nodma apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 nomodeset x11failsafe vga=0x31a
  initrd /initrd-2.6.32.59-0.7-default
 
###Don't change this comment - YaST2 identifier: Original name: linux###
title SUSE Linux Enterprise Server 11 SP1 - 2.6.32.12-0.7
  root (hd0,7)
  kernel /vmlinuz-2.6.32.12-0.7-default root=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part2 resume=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part1 splash=silent crashkernel=256M-:128M showopts vga=0x31a
  initrd /initrd-2.6.32.12-0.7-default
 
###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- SUSE Linux Enterprise Server 11 SP1 - 2.6.32.12-0.7
  root (hd0,7)
  kernel /vmlinuz-2.6.32.12-0.7-default root=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part2 showopts ide=nodma apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 nomodeset x11failsafe vga=0x31a
  initrd /initrd-2.6.32.12-0.7-default
 
 
# numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
node 0 size: 65519 MB
node 0 free: 61097 MB
No distance information available.
BMSuiteDB1:~ # cat /proc/cmdline
root=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part2 resume=/dev/disk/by-id/scsi-3600605b005a36fc0190ea623797d7bba-part1 splash=silent crashkernel=256M-:128M vga=0x31a elevator=deadline numa=off

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM