共計 4576 個字符,預計需要花費 12 分鐘才能閱讀完成。
這篇文章主要講解了“Linux 下 Swap 的用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“Linux 下 Swap 的用法”吧!
Linux 操作系統性能分析主要包含磁盤 IO、CPU、內存以及網絡流量,而這里主要針對系統內存的使用進程情況做個分析。
一、如何查看系統內存使用情況
1、根據常用命令查看系統內存使用概況
free -g
total used free shared buffers cached
Mem: 31 31 0 0 0 3
-/+ buffers/cache: 28 3
Swap: 15 7 7
(根據 free 命令可以看到,系統使用了 28G 的物理內存,3G 的剩余內存,其中 swap 總 15G,已使用 7G)
top (f p M)
top – 14:18:50 up 1280 days, 7:15, 1 user, load average: 1.05, 1.25, 1.12
Tasks: 229 total, 1 running, 227 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32949816k total, 32848840k used, 100976k free, 169308k buffers
Swap: 16771776k total, 8384616k used, 8387160k free, 3276360k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP DATA COMMAND
12428 mysql 15 0 22.2g 20g 3964 S 3.3 66.5 91946:06 1.3g 22g mysqld
22840 cyldj 15 0 9059m 6.7g 9012 S 0.0 21.5 22:05.42 2.1g 8.7g DBAgent
28689 root 15 0 358m 30m 3036 S 0.0 0.1 187:37.41 328m 137m salt-minion
30768 cyldj 21 0 462m 10m 1908 S 0.0 0.0 10:44.60 451m 373m java
22567 root 15 0 86004 3292 2576 S 0.0 0.0 0:00.01 80m 688 sshd
28690 root 20 0 267m 2188 704 S 0.0 0.0 0:00.00 264m 47m salt-minion
661 root 18 0 16340 1836 1632 S 0.0 0.0 0:47.42 14m 308 zabbix_agentd
22569 root 15 0 68156 1520 1188 S 0.0 0.0 0:00.02 65m 408 bash
2901 root 18 0 197m 1336 884 S 0.0 0.0 4:04.57 196m 174m AxisAgent
11236 root 15 0 60672 1324 760 S 0.0 0.0 2:01.21 57m 608 sshd
665 root 15 0 18432 1260 992 S 0.0 0.0 11:39.82 16m 308 zabbix_agentd
662 root 15 0 18432 1256 992 S 0.0 0.0 11:43.36 16m 308 zabbix_agentd
(根據 top 命令可以看到使用內存最大的進程是 mysql 進程,其次是 dbagent,其中 dbagent 使用的交換分區較多)
nmon (m)
nmon 下載地址:
https://sourceforge.net/projects/nmon/files/nmon_x86_64_rhel5/download (RHEL5)
https://sourceforge.net/projects/nmon/files/nmon_linux_14i_newer_Linux_versions.tar.gz/download(RHEL6)
(通過 nmon 可以看到內存的詳細分配情況,其中總內存為 32177.6 MB,總 swap 16378.7 MB , 空閑 93.4 MB,可回收 3188.2+166.5 MB,已使用交換分區 7273.6MB,已使用的活動數據大小為 30099.9MB,可以被交換出內存的數據大小為 1590.7 MB)
2、根據系統監控查看系統內存使用情況
(近 7 天的內存使用情況)
3、查看指定進程的系統內存使用信息
cat /proc/22840/statm
#virt res shr text lib data dt
2319113 1768037 2253 3836 0 2292997 0
(上述是查看 dbagent 的內存使用信息,其中單位是頁數,所以要看系統頁大小 4K,第一列是虛擬內存 2319113 頁,第二列是駐留內存 1768037 頁,第三列是共享內存 2253 頁,進程獨占內存大小為 res-shr)
getconf PAGESIZE
4096
awk /^Swap:/ {SWAP+=$2}END{print SWAP KB} /proc/${pid}/smap
for i in `cd /proc;ls |grep ^[0-9] |awk $0 100 do awk /Swap:/{a=a+$2}END{print $i ,a/1024 M} /proc/$i/smaps ;done |sort -k2nr
(上述命令可以查看進程虛擬內存使用情況)
cat /proc/22840/status |grep Vm
VmPeak: 9341632 kB
VmSize: 9276452 kB
VmLck: 0 kB
VmHWM: 7074296 kB
VmRSS: 7073540 kB
VmData: 9171904 kB
VmStk: 84 kB
VmExe: 15344 kB
VmLib: 4728 kB
VmPTE: 15596 kB
(上述命令可以查看指定進程的內存使用情況 VmSize 表示虛擬內存大小,VmRSS 表示駐留內存大小)
二、綜合分析 MYSQL 數據庫內存使用情況
sh show_mem_usage.sh
全局內存大小:18592.00 MB
單線程最大內存:25.18 MB
最大線程占用內存:8815.62 MB
歷史最大線程占用內存:5213.81 MB
Innodb Buffer Pool 使用率: 99.00%
從 mysql 的內存使用和總的物理內存使用來看,服務器的內存使用已經基本達到上限(mysql 駐留內存大約是 21G,dbagent 大約為 7G,物理總內存為 31G,緩存了 3G,大約有 2G 左右的非活動區內存),當 mysql 進程、dbagent 使用超過 5G 內存,物理內存不夠,就會使用到了 swap 分區。
三、什么情況下會使用 swap 分區
1、物理內存確實不夠用的情況下,會使用到 swap 分區。
2、物理內存還有足夠的內存使用,比如 cache,buffer 的剩余較多的情況下使用了 swap 分區
四、使用 swap 分區擴展
如果有足夠的物理內存,依舊使用了 swap 分區,可以從以下幾方面查看為什么使用了 swap 分區
1、swap 分區比例調整
cat /etc/sysctl.conf |grep swap
vm.swappiness=0
設置為 0 表示優先最大限度的使用物理內存緩存數據,而不是磁盤作為分區,值越大越不利于物理內存的充分利用
2、numa 陷阱
為了提高 cpu 和內存的數據訪問速度、并發度,設計了 numa 架構,但如果 numa 的內存分配策略不合理,那么將會嚴重影響到內存的使用,尤其是對大內存塊使用的數據庫服務器。
#numactl –hardware
available: 2 nodes (0-1)
node 0 size: 16160 MB
node 0 free: 15 MB
node 1 size: 16131 MB
node 1 free: 78 MB
node distances:
node 0 1
0: 10 20
1: 20 10
(上述命令可以查看各個 node 節點的物理內存分配情況,可以看到兩節點的內存分配比例基本平均,如果 node0 節點 free 和和 node1 的 free 值相差較大,說明分配策略存在問題,很大可能會帶來 swap 使用,而物理內存空閑的狀態)
也可以通過查看 numastat 查看 numa 的 miss 和 hit 比例來進一步確認
#numastat
node0 node1
numa_hit 39150779957 38736256884
numa_miss 2658848763 8851827358
numa_foreign 8851827296 2658848763
interleave_hit 122652306 137287417
local_node 39096884744 38598664497
other_node 2712743976 8989419745
3、解決方案
(1)啟用大頁管理
(2)關閉 numa
***BIOS 關閉 NUMA
*** 啟動內核關閉:
vi /boot/grub/grub.conf
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
重啟操作系統,通過 cat /proc/cmdline 和 numactl –hardware 查看是否關閉
(3)調整內核參數
內核參數:zone_reclaim_mode,如果為 0 的話,那么系統會傾向于從其他節點分配內存,如果是 1 表示系統會傾向于從本地節點回收 Cache 內存多數時候
vm.swappiness=0
echo 0 /proc/sys/vm/zone_reclaim_mode ; echo vm.zone_reclaim_mode = 0 /etc/sysctl.conf
(4)調整內核參數
Mysql 可以調整相關參數、交叉啟動方式來改善 numa,例如 numactl –interleave=all /etc/init.d/mysql start
localalloc 規定進程從當前 node 上請求分配內存;
preferred 比較寬松地指定了一個推薦的 node 來獲取內存,如果被推薦的 node 上沒有足夠內存,進程可以嘗試別的 node。
membind 可以指定若干個 node,進程只能從這些指定的 node 上請求分配內存。
interleave 規定進程從指定的若干個 node 上以 RR(Round Robin 輪詢調度)算法交織地請求分配內存。
#NUMA support
numa_interleave = 1
innodb_buffer_pool_populate = 1
flush_caches=1
感謝各位的閱讀,以上就是“Linux 下 Swap 的用法”的內容了,經過本文的學習后,相信大家對 Linux 下 Swap 的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!