Linux下Swap的用法
发布时间:2022-01-19 16:27:58 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要讲解了Linux下Swap的用法,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习Linux下Swap的用法吧! Linux操作系统性能分析主要包含磁盘IO、CPU、内存以及网络流量,而这里主要针对系统内存的使用进
这篇文章主要讲解了“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的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。 (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |