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下载地址:

(RHEL5)

(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=0echo 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

%E4%BA%A4%E5%8F%89%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8%E8%AF%B4%E6%98%8E/

linux内存使用策略swap,Linux Swap使用分析相关推荐

  1. Linux内存管理第十一章 -- Swap Management

    文章目录 Linux内存管理第十一章 -- Swap Management Describing the Swap Area Mapping Page Table Entries to Swap En ...

  2. Linux内存管理 brk(),mmap()系统调用源码分析2:brk()的内存释放流程

    Linux brk(),mmap()系统调用源码分析 brk()的内存释放流程 荣涛 2021年4月30日 内核版本:linux-5.10.13 注释版代码:https://github.com/Rt ...

  3. 【openWrt】随身wifi装openWrt的linux内存不够用?开启swap分区吧

    背景 我用随身wifi装了openWrt跑docker,想跑一个wordpress,但是运行了mysql容器和wordpress容器,385.29M的运行内存根本跑不起来.  棒子一直卡死,每次都得重 ...

  4. linux内存管理策略,Glibc内存管理—ptmalloc内存分配策略(1)

    一.linux的内存布局 1.32位模式下内存的经典布局​ 图1 32位模式下内存经典布局 ​ 注:这种内存布局模式是linux内核2.6.7以前的默认内存布局形式 说明:(1)在32的机器上,lo ...

  5. linux 内存占用_分享Linux内存占用几个案例

    案例一 问题 最近一台 CentOS 服务器,发现内存无端损失了许多,free 和 ps 统计的结果相差十几个G,非常奇怪,后来Google了许久才搞明白. 分析 1.linux系统内存消耗主要有三个 ...

  6. linux内存管理实验malloc,linux内存管理实验报告.doc

    linux内存管理实验报告 操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人 实验题目:内存管理实验 实验目的 通过本次试验体会操作系统中内存的分配模式: 掌 ...

  7. Linux内存管理 brk(),mmap()系统调用源码分析1:基础部分

    Linux内存管理 brk(),mmap(),munmap()系统调用源码分析 基础部分 荣涛 2021年4月30日 内核版本:linux-5.10.13 注释版代码:https://github.c ...

  8. linux 内存清理 释放命令,linux 内存清理/释放命令总结

    本文介绍了linux 内存清理/释放命令,具体如下: 1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用 ...

  9. linux 内存清理 释放命令,linux 内存清理释放命令(示例代码)

    linux 内存清理/释放命令 1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m ...

最新文章

  1. 如何判断LSTM模型中的过拟合和欠拟合 By 机器之心2017年10月02日 11:09 判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事。也许你会得到一个不错的模型技术得分,但了解
  2. FAIR重磅发布大规模语料库XNLI:解决跨15种语言理解难题
  3. Keras-4 mnist With CNN
  4. java如何把方法封装成接口,RxJava配合Retrofit实现网络封装
  5. 无失真压缩法可以减少冗余_CVPR 2020 论文概述:基于深度学习的层级式视频压缩方法...
  6. 字节跳动面试真题:java高级编程考试题及答案
  7. Eclipse 提示 The given project is not a virtual component project
  8. 陀螺仪数据转换成角度_请教怎么把用陀螺仪积分得到的角度转换到大地坐标系下?...
  9. HTML - 字符实体
  10. Atitit 网关协议cgi wsgi fcgi fastcgi 目录 1.1. CGI(common gateway unterface) 1 1.2. 2.1 WSGI: 1 1.3. 2.3
  11. 微信小程序模板(template)小程序免费模板平台
  12. [嵌入式linux]PCIe 热拔插(rescan)
  13. Boost.Asio Library
  14. gnfc——游戏增强现实语音通话系统
  15. 详解Decorator模式和vistor模式
  16. oralce 递归查询语句
  17. Ryzen3 2200g安装Debian11.1后配置VBox
  18. 调试stvd遇到的问题
  19. el-element布局控件layout中的el-row和el-col
  20. python 学习日记 —— dict 字典的用法

热门文章

  1. C++查看各种数据类型所占字节和最大最小值(数据范围)
  2. OpenCV学习笔记(十八):凸包,最小包围区域算子:convexHull(),minAreaRect(),minEnclosingTriangle(),minEnclosingCircle()
  3. 操作系统--多进程管理CPU
  4. 执行-技术人的管理之路--总结
  5. 脏读、不可重复读和幻读
  6. p图软件pⅰc_惊爆软件:王者荣耀P图大神,助力少年国服梦
  7. matlab 数值格式转换,Matlab字符串转换及数值格式转换
  8. LwIP应用开发笔记之二:LwIP无操作系统UDP服务器
  9. linux---基础01
  10. 域控下发脚本_域环境下做到单用户登陆控制脚本