Linux內存子系統及常用調優參數

內存子系統及常用調優參數

內存子系統組件

 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 追蹤某個命令的運行路徑



  1. 降低微型內存對象的系統開銷

    slab

  2. 縮減慢速子系統的服務時間

    使用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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章