內存子系統及常用調優參數
內存子系統組件
slab allocator
buddy system
kswapd
pdflush
mmu
虛擬化環境:
PA(進程地址)-->HA(虛擬機地址)-->MA(物理機地址)
虛擬機轉換:PA-->HA
guestOS虛擬機內核,OS物理機內核
shadow PT
Memory:
TLB:提升性能
HugePages 內存大頁面
[root@localhost domain1]# cat /proc/meminfo |grep -i Huge
AnonHugePages: 0 kB
HugePages_Total: 0 未啓用
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Enable hugepages 啓用
方法1:永久生效
[root@localhost ~]# vim /etc/sysctl.conf
vm.nr_hugepages = 10
方法2:臨時生效
[root@localhost domain1]# sysctl -w vm.nr_hugepages=10
vm.nr_hugepages = 10
掛在當做文件系統用
[root@localhost domain1]# mkdir /hugepages
[root@localhost domain1]# mount -t hugetlbfs none /hugepages
測試
[root@localhost ~]# dd if=/dev/zero of=/hugepages/a.test bs=100M count=1000000
[root@localhost ~]# ll -h /hugepages/
total 0
-rw-r--r--. 1 root root 0 Jun 5 12:18 a.test
因爲是內存 所以大小爲0,且不允許用戶直接使用(不能複製和新建文件進去),只能進程使用
strace 追蹤命令
1.strace -p PID 追蹤已啓動進程是怎麼調用系統資源的
-o 指定追蹤到以後的輸出路徑,保存到文件中。
-p 指定進程的pid
-c追蹤整體結果
2.strace COMMAND 追蹤命令時怎麼執行的
[root@localhost ~]# strace cat /etc/fstab 追蹤某個命令的運行路徑
降低微型內存對象的系統開銷
slab
縮減慢速子系統的服務時間
使用buffer cache緩存文件元素據
使用page cache緩存DISK IO
使用shm完成進程間通信
使用buffer cache ,arp cache和connetion tracking提升網絡IO性能
過量使用:
CPU的過量使用,多臺虛擬機CPU總數超過物理機
內存的過量使用,超出物理內存的一部分,以swap爲前提
使用swap:
# cat /proc/sys/vm/overcommit_memory
0 啓發式過量,系統自己決定如何過量使用
1總是過量使用,在數據庫服務器上儘可能不要使用swap
2所有的物理內存加上一部分swap
# cat /proc/sys/vm/overcommit_ratio
50 表示可以超出物理內存的百分比,這裏是50%,一般儘可能不超過50%(確保50%不超過swap空間)
內存溢出時,OOM 會殺死該進程.
[root@localhost ~]# ls /proc/1 下的
oom_score記錄每個進程的oom分數,分數高的進程會被當做惡意進程殺掉。
oom_adj調整score的,可以優先監控某個進程,或儘可能留到最後殺掉。
slabtop隨機監控系統的所有slab狀態
[root@localhost ~]# cat /proc/slabinfo 查看換存量大小
tw_sock_TCPv6 0 0 320 12 1 : tunables 54 27 8 : slabdata 0 0 0
###limit=54代表可以被每一個cpu緩存的最大對象數,可以調整
###batchcount=27 表示當cpu緩存空的時候最大可以一次性讓cpu緩存下來多少個對象,可調整
###shared=8 表示在各cpu之間可以共享多少個slab cache (共享多少個緩存的),可調整
調整緩存量大小的方法:
# echo 'tw_sock_TCPv6 108 54 8' > /proc/slabinfo
如何調整網絡IO的arp緩存:
軟限制可以超出50% 默認爲512
硬限制絕對不能超出 默認爲1024
gc:垃圾回收器,默認緩存條目少於128個的時候不自動清理。
[root@localhost ~]# cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.0.149 0x1 0x2 28:d2:44:8e:5c:16 * eth0
192.168.0.163 0x1 0x2 08:ed:b9:12:c1:6d * eth0
[root@localhost ~]# ip neighbor list 顯示緩存條目
192.168.0.163 dev eth0 lladdr 08:ed:b9:12:c1:6d REACHABLE
192.168.0.146 dev eth0 lladdr b4:b5:2f:dc:aa:72 STALE
[root@localhost ~]# ip neighbor flush dev eth0 清空eth0上所有的緩存條目
[root@localhost ~]# ls -l /proc/sys/net/ipv4/neigh/default
total 0
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_interval
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_thresh1
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_thresh2
-rw-r--r-- 1 root root 0 Jun 5 16:46 gc_thresh3
gc_thresh1 清理預值,默認128個,超過128個爲過期條目,允許使用5分鐘,後由gc自動清理
gc_thresh2 軟限制,默認512個,超出軟限制的部分只允許存在5秒鐘,個數不能達到硬限
gc_thresh3 硬限制,默認1024個
gc_interval 定義每過幾秒鐘檢查一下哪些過期。
頁緩存:page cache降低磁盤IO,把文件讀取出來放在內存裏
lowmen_reserve_ratio 內存很低的時候預留多大空間,64位操作系統不用調整
vfs_cache_pressure 控制內核去回收內存的趨勢(回收inode,directory)
[root@localhost ~]# cat /proc/sys/vm/lowmem_reserve_ratio
256 256 32
內存很低的時候預留多大空間,64位操作系統不用調整
[root@localhost ~]# cat /proc/sys/vm/vfs_cache_pressure
100
降低該值後儘可能少回收內存,達到優化效果,0表示不回收,有可能導致內存溢出,在0-100之間傾向於不回收。大於100則更傾向於回收。
[root@localhost ~]# cat /proc/sys/vm/page-cluster
3
page-cluster =1 控制需要將數據從內存拿到交換分區上去的時候一次拿多少個。默認是3
=1表示一次交換出去2的1次方個
=2表示一次交換出去2的2次方個
。。。
[root@localhost ~]# cat /proc/sys/vm/zone_reclaim_mode
0
zone_reclaim_mode 內存區域回收的時候更傾向回收哪一段的內存。
1表示內存區域回收功能打開
2表示回收寫操作產生的頁面
4表示回收swap的頁面
Anonymous pages 匿名頁
存放程序,進程自身產生的數據
IPC,進程之間通信也是由匿名頁完成的
Anonymous pages = RSS-Shared
[root@localhost ~]# grep Anon /proc/meminfo 查看匿名頁大小
AnonPages: 16104 kB
AnonHugePages: 0 kB
[root@localhost ~]# cat /proc/PID/statm 查看進程的匿名頁
進程間通信管理命令
[root@localhost ~]# ipcs -l 查看當前的內存設置
------ Shared Memory Limits --------
max number of segments = 4096 共享內存最大多大
max seg size (kbytes) = 67108864 段大小最大是多少個字節
max total shared memory (kbytes) = 17179869184 允許在全局範圍內使用的內存多大
min seg size (bytes) = 1 最小段是個字節
------ Messages: Limits --------
max queues system wide = 1954 全局範圍內最大有多少個隊列
max size of message (bytes) = 65536 每一個信息的最大大小是多少
default max size of queue (bytes) = 65536 默認每一個隊列所能接受的消息的最大體積是多大
ipcrm 移除某個消息隊列
關於共享內存的參數:
[root@localhost ~]# cat /proc/sys/kernel/shmmni 系統級別,所允許使用的共享內存段上限
[root@localhost ~]# cat /proc/sys/kernel/shmall 系統級別,能夠爲共享內存分配使用的最大頁面數
[root@localhost ~]# cat /proc/sys/kernel/shmmax 單個共享內存的最大大小上限有多大
關於消息的參數:ipcs -p 查看隊列
[root@localhost ~]# cat /proc/sys/kernel/msgmnb 單個消息隊列的上限。
65536
[root@localhost ~]# cat /proc/sys/kernel/msgmni 系統級別,消息隊列的個數上限
1954
[root@localhost ~]# cat /proc/sys/kernel/msgmax 單個消息隊列大小的上限,單位字節
65536
pdflush: 調整內存使用空間,清除內存上的章頁到磁盤上去
[root@localhost ~]# cat /proc/sys/vm/nr_pdflush_threads 顯示當前默認啓動了多少個pdflush
0
[root@localhost ~]# cat /proc/sys/vm/dirty_background_ratio 相當於全部的內存來說,章頁佔了多大比例開始清寫
[root@localhost ~]# cat /proc/sys/vm/dirty_ratio 單個進程的章頁達到整個內存比例的多少開始清寫
[root@localhost ~]# cat /proc/sys/vm/dirty_expire_centisecs pdflush週期性啓動的時間間隔,0表示禁止,單位是百分之一秒
[root@localhost ~]# cat /proc/sys/vm/dirty_writeback_centisecs 一個髒頁在內存中存儲多久以後變爲過期,並且需要立即啓動清寫線程
手動清寫髒緩存和緩存:先同步再釋放
sync命令
echo s > /proc/sysrq-trigger
echo 3> /proc/sys/vm/drop_caches
1表示釋放pagecache
2表示釋放dentries 和inodes
3表示釋放pagecache和dentries和 inodes
比較進程的oom分水,誰分數越高越優先被殺死,在可用內存空間被用盡時開始殺死進程
# cat /proc/PID/oom_score查看oom分數,分數是系統通過觀察,自動生成的,參考標準爲/proc/PID/oom_adj
oom_adj的值是從-17到15,有效範圍是-16到15。-17則表示進程永遠不會被oom kill掉,oom_adj的值越大得到的oom_score的值也會越大,被殺死的可能也就越大
# cat /proc/sys/vm/panic_on_oom 如果該值爲0則表示啓用oom功能,當內存空間不足時,開始殺掉進程,1表示不啓用
如何使用valgrind 去評估內存分數
#valgrind --tool=memcheck cat /proc/$$/maps $$表示當前進程的進程號
評估結果:
==4316== HEAP SUMMARY:
==4316== in use at exit: 0 bytes in 0 blocks
==4316== total heap usage: 31 allocs, 31 frees, 40,544 bytes allocated
==4316==
==4316== All heap blocks were freed -- no leaks are possible 沒有內存泄漏
==4316==
==4316== For counts of detected and suppressed errors, rerun with: -v
==4316== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
使用watch -n 不間斷的去觀察某些進程
# watch -n1 'ps axo pid,comm,rss,vsize |grep sshd'
如果rss和vsize只增不減的時候就有可能內存泄漏了
# sar -R 1 120 查看整體內存的分配情況
Swap
Swap-out從系統寫到swap交換分區上,非活動頁,匿名頁,
Swap-in 從swap上讀取數據到系統
Swap cache從swap加載進來卻沒在內存中做任何修改的數據,此頁面在內存刪除後再swap上還有,可以有效的避免資源競爭。
提高swap性能,1使用小swap分區,2降低訪問次數,3降低服務時間。
調整使用swap的概率:
# cat /proc/sys/vm/swappiness 使用swap的傾向百分比,大於100則開始啓用swap
swap大小
批處理系統:4倍的RAM
數據庫服務器:<=1G
web server:>=0.5倍RAM
調優性能:多個設備多建幾個分區
/dev/sda1 swap swap pri=5 0 0
/dev/sdb1 swap swap pri=5 0 0
LABEL=testswap swap swap pri=5 0 0
/swaps/swapfile1 swap swap pri=1 0 0
sar -W顯示交換分區的動態
sar -B 顯示IO狀況
pgpgin/s IO讀進
pgpgout/s 讀出
fault/s 錯誤
majflt/s
pgfree/s 頁面釋放,每秒鐘平均個數
pgscank/s 掃描個數
pgscand/s
pgsteal/s
%vmeff
總結內存優化需要調的:
Hugepage
IPC
pdflush
slab
swap
oom