Linux系统排查1——内存篇
常见工作中,计算机系统的资源主要包括CPU,内存,硬盘以及网络,过度使用这些资源将使系统陷入困境。本系列一共四篇博文,结合我在实习期间的学习,介绍一些常见的Linux系统排障工具及方法。
第1篇——内存篇
第2篇——CPU篇
第3篇——磁盘I/O篇
第4篇——网络篇
事实上,当上述服务器系统资源中的任何一个遭遇瓶颈,都会带来服务器性能的下降,典型的症状就是系统运行迟缓。
本文从以下几个角度介绍Linux系统内存相关的排查。
1. 内存的使用率如何查看,使用率真的很高吗
2. 内存用在哪里了
3. 内存优化可以有哪些手段
1. 内存硬件查看
# dmidecode -t memory
# dmideocde -t memory
//以下为命令输出节选
# dmidecode 2.12
# SMBIOS entry point at 0x7f6be000
SMBIOS 2.5 present. Handle 0x0005, DMI type , bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: Single-bit ECC
Maximum Capacity: GB
Error Information Handle: Not Provided
Number Of Devices: Handle 0x0010, DMI type , bytes
Memory Module Information
Socket Designation: DIMM06
Bank Connections:
Current Speed: ns
Type: DIMM
Installed Size: MB (Single-bank Connection)
Enabled Size: MB (Single-bank Connection)
Error Status: OK Handle 0x0011, DMI type , bytes
Memory Device
Array Handle: 0x0005
Error Information Handle: Not Provided
Total Width: bits
Data Width: bits
Size: MB
Form Factor: DIMM
Set: None
Locator: DIMM06
Bank Locator: BANK06
Type: Other
Type Detail: Unknown
Speed: MHz
Manufacturer: Hynix
Serial Number: 5781322C
Asset Tag: Unknown
Part Number: HMT31GR7BFR4C-H9
通过dmidecode工具可以查看很多硬件相关的数据,这里仅以内存为例。我们可以看到,服务器最大支持内存扩充为192GB,目前已经安装了一块海力士(Hynix)生产的8GB内存,该内存插在主板的第六个DIMM插槽上面(物理插槽又称socket)。
该命令能够给出物理内存的许多详细信息,本文并不一一介绍。
2. 内存的大体使用情况
free -m/-h
free命令用来查看系统内存的整体使用情况。
# free -m
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
free -m以MB为单位显示整个系统的内存使用情况,free -h则自动选择以适合理解的容量单位显示:
# free -h
total used free shared buffers cached
Mem: 11G .2G .5G 1.2M 305M .1G
-/+ buffers/cache: .8G .9G
Swap: 856M 0B 856M
可以看到系统内存12GB(总可用11.7GB),当前已用6.2G,剩余5.5GB。这个例子中我们看到系统的内存使用并不高,但即便free命令显示的"used"的值很高,接近total的值,那么系统就真的没有内存空间了吗?
我们可以看到free 命令下面有一行“-/+ buffers/cache”,该行显示的used是上一行“used”的值减去buffers和cached的值,同时该行的free是上一行的free加上buffers和cached的值。这里可以看到,尽管第一行的used显示共使用了6.2GB的物理内存,但除去buffers和cached数据后,实际仅仅占用了3.8GB的内存,而如果剩余空间加上buffers和cached数据当前占用的内存,将达到8BG之多。
这是因为buffers和cache数据是动态变化的,内存充足时,内核出于性能考虑会进行一定的缓存,当内存空间不足时,buffers, cached占用的空间是可以为了程序释放的。
因此判断系统内存是否耗竭的实际指标是看减去buffer和cache的空间后used空间是否依旧很大,以及交换空间是否被大量占用。显然这个例子不符合内存耗竭的情形。
那么buffers与cached又有什么区别呢?
(1) buffers:记录文件系统的metadata,例如目录里面有什么内容,权限等等;
(2) cached:用来给文件做缓冲,缓存刚刚访问的文件。
3. 哪些进程消耗内存比较多?
top
top命令用来查看具体进程消耗的内存空间。
# top
top - :: up days, :, users, load average: 0.35, 0.23, 0.21
Tasks: total, running, sleeping, stopped, zombie
%Cpu(s): 2.1 us, 2.2 sy, 0.0 ni, 95.3 id, 0.3 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem: total, used, free, buffers
KiB Swap: total, used, free. cached Mem
top 命令查看系统的实时负载, 包括进程、CPU负载、内存使用等等;
进入top的实时界面后,默认按照CPU的使用率排序,通过“shift+m”按键将进程按照内存使用情况排序,可以查看哪些进程是当前系统中的内存开销“大户”。
top命令中,按下 f 键,进入选择排序列的界面,这里可以选择要显示的信息列,要按照哪些信息列进行排序等,该界面上有简要的介绍,这里不再赘述。
可以看到top命令也会显示系统整体的内存使用情况,同样包括了total, used, free, buffers, cached等,需要注意的是,这里并没有像free命令那样提供-/+ buffers/cached之后的值,因此需要经过额外计算才能获得当前系统实际剩余的可用内存。
另一方面,我们查看不同进程的内存开销,
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
mysql S 0.7 2.5 :53.23 mysqld
rabbitmq S 1.7 2.0 :40.86 beam.smp
nova S 0.0 1.2 :42.08 nova-api
nova S 0.0 1.2 :44.65 nova-api
nova S 0.0 1.2 :47.23 nova-api
nova S 0.0 1.2 :45.53 nova-api
通过%MEM列,可以查看哪几个进程占用了大量的内存,在缓解内存不足的紧急情况时,可以终止这些占用内存较多的进程。
top命令中有以下与内存相关的数据列:
(1)VIRT:虚拟内存,是进程申请的虚拟内存总量;
(2)RES: 常驻内存,是进程切实使用的物理内存量,free命令中看到的used列下面的值,就包括常驻内存的加总,但不是虚拟内存的加总;
(3)SHR:共享内存,比如共享库占用的内存等。
4. 交换空间
# swapon
# swapoff
# mkswap
使用free命令可以查看内存的总体使用,显示的内容也包括交换分区的大小,可以使用swapon,swapoff,命令开启或关闭交换空间,交换空间是磁盘上的文件,并不是真正的内存空间。
例如:关闭交换分区
# swapoff -a
# free
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
此时交换分区显示全为0,说明系统没有开启交换分区。swapon命令可以启用交换分区。
当内存不足时,系统会选择通过:1.将部分不常被访问的内存页交换到内存空间,或2.删除部分cache的文件来释放内存空间。
系统的可用内存一般等于物理内存 + 交换分区。交换分区在磁盘上, 因此速度比内存读写要慢得多。
交换分区实际上就是磁盘上的文件,可以通过mkswap命令来创建交换空间。
5. 内核态内存占用
# slabtop
slab系统用来处理系统中比较小的元数据,如文件描述符等,进而组织内核态的内存分配。
一个slab包含多个object,例如dentry这些数据结构就是object,可以通过slabtop命令查看系统中活动的object的数量与内存占用情况,从而了解哪些数据结构最占用内核态的内存空间。
例如:使用slabtop命令查看内核数据结构及内存占用
Active / Total Objects (% used) : / (77.6%)
Active / Total Slabs (% used) : / (100.0%)
Active / Total Caches (% used) : / (53.6%)
Active / Total Size (% used) : .00K / .77K (86.9%)
Minimum / Average / Maximum Object : .01K / .20K / .75K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
% .10K 86996K buffer_head
% .19K 50744K dentry
% .63K 48192K proc_inode_cache
% .96K 68096K ext4_inode_cache
% .06K 3560K kmalloc-
% .04K 2060K ext4_extent_status
% .19K 5848K kmalloc-
% .55K 15472K radix_tree_node
% .11K 2948K sysfs_dir_cache
% .05K 984K shared_policy_node
% .57K 7264K inode_cache
% .07K 824K anon_vma
% .03K 284K kmalloc-
% .25K 1688K kmalloc-
% .02K 104K kmalloc-
% .12K 820K kmalloc-
% .02K 104K kmalloc-
通常关注1. 哪些数据结构的内存占用最大,2. 哪些类型的数据结构对应的object最多,比如inode多代表文件系统被大量引用等。
该交互命令支持的选项与排序标准有:
选项:
--delay=n, -d n 每隔n秒刷新信息
--once, -o 只显示一次
--sort=S, -s S 按照S排序,其中S为排序标准 排序标准(shift + 对应的键):
a:根据active objects数量高低排序
b:根据 objects / slab高低来排序
c:根据cache大小排序
l:根据slab数量排序
v:根据active slabs数量排序
n:按 name 排序
o:按照 objects 数量排序
p:按照 pages / slab 的值排序
s:按照 object 大小排序
u:按照 cache 使用量排序
6. 查看内存使用的动态变化
# vmstat
vmstat命令可以查看内存使用的动态变化,
例如: 使用vmstat动态监视内存变动
# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
其中# vmstat N 代表每隔N秒更新一次数据。
7. dstat
# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
|4630B 129k| | |
| 708k| 53k 6732k| |
| 8192B| 34k 6595k| |
| 12k| 39k 6898k| |
| 4096B| 44k 7256k| |
| | 38k 7109k| |
| 24k| 37k 7295k| |
| 12k| 36k 7482k| |
| 4096B| 37k 6923k| |
8. 查看共享内存空间
pmap
可以使用pmap命令查看进程使用的共享内存,包括使用的库,所在堆栈空间等。
# pmap -d
: /sbin/init
Address Kbytes Mode Offset Device Mapping
00007fb45d59c000 r-x-- : libnss_files-2.19.so
00007fb45d5a7000 ----- 000000000000b000 : libnss_files-2.19.so
00007fb45d7a6000 r---- 000000000000a000 : libnss_files-2.19.so
00007fb45d7a7000 rw--- 000000000000b000 : libnss_files-2.19.so
00007fb45d7a8000 r-x-- : libnss_nis-2.19.so
00007fb45d7b3000 ----- 000000000000b000 : libnss_nis-2.19.so
00007fb45d9b2000 r---- 000000000000a000 : libnss_nis-2.19.so
00007fb45d9b3000 rw--- 000000000000b000 : libnss_nis-2.19.so
9. 查看系统内存历史记录
# sar
可以使用sar命令查看一个月以内的内存使用情况。
如何清理内存使用
1. 释放占用的缓存空间
# sync //先将内存刷出,避免数据丢失
# echo 1 > /proc/sys/vm/drop_caches //释放pagecache
# echo 2 > /proc/sys/vm/drop_caches //释放dentry和inode
# echo 3 > /proc/sys/vm/drop_caches //释放pagecache、dentry和inode
2. 终止进程
与Linux内存相关的文件系统文件
/proc/meminfo
内存信息
/proc/$pid/status
进程状态信息,
/proc/$pid/statm
进程物理内存信息
/proc/slabinfo
slab的分布状况
/proc/vmstat
虚拟内存信息
一些额外的小技巧
1. 降低swap的使用率:
# sysctl -a | grep swappiness
vm.swappiness = 60
可以查看当前swap的使用
2. 限制其他用户的内存使用
# vim /etc/security/limits.conf user1 hard as 1000 (用户user1所有累加起来,内存不超过1000kiB)
user1 soft as 800 (用户user1一次运行,内存不超过800kiB)
3. 大量连续内存数据:
# vim /etc/sysctl.conf vm.nr_hugepage=20
4. 调节page cache(大量一样的请求 调大page cache)
vm.lowmem_reserve_ratio = 256 256 32 (保留多少内存作为pagecache 当前 最大 最小)
vm.vfs_cache_pressure=100 (大于100,回收pagecache)
vm.page.cluster=3(一次性从swap写入内存的量为2的3次方页)
vm.zone_reclaim_mode=0/1(当内存危机时,是否尽量回收内存 0:尽量回收 1:尽量不回收)
min_free_kbytes:该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。
5. 脏页
vm.dirty_background_radio=10 (当脏页占内存10%,pdflush工作)
vm.dirty_radio=40 (当进程自身脏页占内存40%,进程自己处理脏页,将其写入磁盘)
vm.dirty_expire_centisecs=3000 (脏页老化时间为30秒 3000/100=30秒)
vm.dirty_writeback_centisecs=500 (每隔5秒,pdflush监控一次内存数量 500/100=5秒)
脏页是指已经更改但尚未刷到硬盘的内存页,由pdflush往硬盘上面刷。
Linux系统排查1——内存篇的更多相关文章
- Linux系统排查——CPU负载篇
本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...
- Linux系统排查4——网络篇
用于排查Linux系统的网络故障. 网络排查一般是有一定的思路和顺序的,其实排查的思路就是根据具体的问题逐段排除故障可能发生的地方,最终确定问题. 所以首先要问一问,网络问题是什么,是不通,还是慢? ...
- (转)Linux系统排查4——网络篇
原文:http://www.cnblogs.com/Security-Darren/p/4700387.html 用于排查Linux系统的网络故障. 网络排查一般是有一定的思路和顺序的,其实排查的思路 ...
- 【转】一文掌握 Linux 性能分析之内存篇
[转]一文掌握 Linux 性能分析之内存篇 前面我们已经学习了 CPU 篇,这篇来看下内存篇. 01 内存信息 同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法. 1.1 /pro ...
- C/C++获取Linux系统CPU和内存及硬盘使用情况
需求分析: 不使用Top df free 等命令,利用C/C++获取Linux系统CPU和内存及硬盘使用情况 实现: //通过获取/proc/stat (CPU)和/proc/meminfo(内存 ...
- 重新整理 .net core 实践篇 ———— linux上排查问题 [外篇]
前言 简单介绍一下在排查问题.献给初学者. 该文的前置篇: https://www.cnblogs.com/aoximin/p/16838657.html 正文 什么是linux系统 linux 是基 ...
- 一文掌握 Linux 性能分析之内存篇
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 前面我们已经学 ...
- Linux系统下分析内存使用情况的管理工具
有许多办法可以获得Linux系统上所安装内存的信息,并查看其中有多少内存正在使用中.有的命令会展示大量的细节,而有的命令则提供了简洁(但不一定容易理解)的结果.在这篇文章中将介绍一些更有用的工具,帮助 ...
- linux进程间通信之共享内存篇
本文是对http://www.cnblogs.com/andtt/articles/2136279.html中共享内存(上)的进一步阐释说说明 1 共享内存的实现原理 共享内存是linux进程间通讯的 ...
随机推荐
- 设置div居中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- IOS基础之 (四) OC对象
一 建立一个OC的类 完整的写一个函数:需要函数的声明和定义. 完整的写一个类:需要类的声明和实现. 1.类的声明 声明对象的属性和行为 #import <Foundation/Foundati ...
- python + selenium + PhantomJS 获取腾讯应用宝APP评论
PhantomJS PhantomJS 是一个基于WebKit的服务器端JavaScript API,它无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM 处理.JavaScr ...
- Centos是什么
Linux是GNU/Linux的缩写,通常指各种Linux发行版的通称. 常见的Linux厂家主要有Redhat/Novell等. Redhat有两大Linux产品系列,其一是免费的Fedora Co ...
- Fedora下安装ORACLE 11g
一.硬件检测 1.内存检测 oracle11g要求最低1GB内存 命令: grep MemTotal /proc/meninfo 2.交换空间检测 通常交换空间是内存1.5倍 命令: grep ...
- Laravel教程 二:路由,视图,控制器工作流程
Laravel教程 二:路由,视图,控制器工作流程 此文章为原创文章,未经同意,禁止转载. View Controller 上一篇教程我们走了那么长的路,终于把Laravel安装好了,这一篇教程我们就 ...
- SQLServer 数据导入导出 SSIS 包 位置
笔记:sqlserver 在执行数据导入导出的时候,可以选择是否保存SSIS包,如果选择保存,在保存方式有:SQlserver .文件系统.如果选择sqlserver 则 包信息保存在 msdb 系统 ...
- Visual Studio 2013 中 mysql 使用 EF6
1.web.config <configSections> <!-- For more information on Entity Framework configuration, ...
- heap和stack有什么区别
1.heap是堆,stack是栈. 2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配. 3.stack空间有限,heap的空间是很大的自由 ...
- kindle paperwhite折腾记
在亚马逊官网上买了一个kindle paperwhite 一代(849元) , 打算再买个皮套, 淘宝店 http://detail.tmall.com/item.htm?spm=a230r.1.1 ...