您好,登錄后才能下訂單哦!
這篇文章主要講解了“Linux下Swap的用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。