共计 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 小编将为大家推送更多相关知识点的文章,欢迎关注!