Linux内存查看及一次释放Linux内存问题处理(Aliyun ecs)
Evan(讨论 | 贡献)2020年2月5日 (三) 03:38的版本 (Evan移动页面Linux内存查看及一次释放Linux内存问题处理至Aliyun Linux内存查看及一次释放Linux内存问题处理)
1.linux查看的一般方法:
按照离CPU由近到远的顺序依次是CPU寄存器、Cache、内存、硬盘,越靠近CPU的存储器容量越小但访问速度越快 1).free -m # or free -g 常用参数为 -m -g -h -s #注意 正常情况下free不能太小 不能有swap used 不然一般是有问题的,虽然说少量地使用swap是不是影响到系统性能的 [root@vm ~]# free -m total used free shared buffers cached Mem: 999 256 743 0 21 136 -/+ buffers/cache: 99 900 Swap: 2015 0 2015 2). top ->M 一般就可以看到这些使用内存比较多的程序的 如果这两个看到的不多,但是free很少 那就是有问题了 如昨天
2. 问题来了
Q: [root@evan]# free -m total used free shared buffers cached Mem: 15950 15229 721 0 331 1020 [root@ ~]# top Mem: 16333644k total, 15589488k used, 744156k free, 339752k buffers Swap: 0k total, 0k used, 0k free, 1044796k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1993 redis 20 0 150m 25m 1144 S 0.7 0.2 373:35.07 mem-server 20 0 39720 23m 1660 S 0.0 0.1 0:04.27 apache 重启了常用的服务还是不行 原因 : 这是因为linux的缓存机制造成的 可以使用下面的方法测试下 #释放前sync一下,防止丢数据。 至于 sync 命令。它和 cached 有关。它的功能是,把脏页写回磁盘,也就是把修改过的数据还没写到磁盘的数据写到磁盘上。因为内核会延迟提交,每次提交多积累一些数据,以提高效率、降低延迟。没有使用的必要,只会让系统卡一下而已 https://segmentfault.com/q/1010000002439931 sync #释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。 #释放 echo 3 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义: 0:不释放(系统默认值) 1:释放页缓存 2:释放dentries和inodes 3:释放所有缓存 # 这个是有可能影响业务的,建议在适当的时间清理一下 #释放完内存后改回去让系统重新自动分配内存。 echo 0 > /proc/sys/vm/drop_caches 处理后 [root@evan]# free -m total used free shared buffers cached Mem: 15950 433 15517 0 3 31 处理问题用到的知识点如下 ######### Linux释放内存的相关知识 ############### 在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空 间影响性能,例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。,此时就需 要执行释放内存(清理缓存)的操作了。 Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分 缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉吗?所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是 释放缓存的操作了。/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改 /proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。要达到释 放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就 是不释放缓存。 一般复制了文件后,可用内存会变少,都被cached占用了,这是linux为了提高文件读取效率的做法:为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。" ########################
3.知识点:
free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。 常用参数为 -m -g -h -s 命令功能: free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略 命令参数: -b 以Byte为单位显示内存使用情况。 -k 以KB为单位显示内存使用情况。 -m 以MB为单位显示内存使用情况。 -g 以GB为单位显示内存使用情况。 -o 不显示缓冲区调节列。 -s<间隔秒数> 持续观察内存使用状况。 -t 显示内存总和列。 -V 显示版本信息。 root@service]# free total used free shared buffers cached Mem: 32940112 30841684 2098428 0 4545340 11363424 -/+ buffers/cache: 14932920 18007192 Swap: 32764556 1944984 30819572 下面是对这些数值的解释: total:总计物理内存的大小。 used:已使用多大。 free:可用有多少。 Shared:多个进程共享的内存总额。 Buffers/cached:磁盘缓存的大小。 第三行(-/+ buffers/cached): used:已使用多大。 free:可用有多少。 第四行是交换分区SWAP的,也就是我们通常所说的虚拟内存。 区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是2098428KB,已用内存是30841684KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached. 第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。 所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。 如本机情况的可用内存为: 18007156=2098428KB+4545340KB+11363424KB 那buffers和cached都是缓存,两者有什么区别呢? 为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。 磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。 Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。 Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。 简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。 所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准. 如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。 每天一个linux命令(45):free 命令 http://www.cnblogs.com/peida/archive/2012/12/25/2831814.html http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html 手动释放Linux内存的方法 http://www.cnblogs.com/waterdragon/archive/2013/03/01/2938289.html Linux服务器Cache占用过多内存导致系统内存不足问题的排查解决 http://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system.html Linux Used内存到底哪里去了? http://blog.yufeng.info/archives/2456 http://www.myjishu.com/?p=82 http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html
4.其它常用命令
获得当前系统中运行的最占内存的前10个程序: ps aux | sort -k 6 -rn | head -n10 ps aux| grep -v "USER" |sort -n -r -k 4 |awk 'NR==1{ print $0}' ps aux --sort -rss pmap PID #查看静态内存使用情况 top #按shift+m 按照内存使用情况进行排序。 ps -ef | grep apache #查看PID 比如是1234 cat /proc/1234/status #查看详细的信息 top -b -n 1 | grep apache top -b -n 1 |grep apache |awk '{print "cpu:"$9"%","mem:"$10"%"}' cat /proc/meminfo ps -eo pid,args,rss|grep apache|grep -v grep|awk ‘{a+=$NF}END{print a}’ http://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system.html sar 找出系统瓶颈的利器 yum install -y sysstat && echo 'ENABLED=”true”' > /etc/default/sysstat && /etc/init.d/sysstat start sar -q: 查看平均负载 sar参数说明 -A 汇总所有的报告 -a 报告文件读写使用情况 -B 报告附加的缓存的使用情况 -b 报告缓存的使用情况 -c 报告系统调用的使用情况 -d 报告磁盘的使用情况 -g 报告串口的使用情况 -h 报告关于buffer使用的统计数据 -m 报告IPC消息队列和信号量的使用情况 -n 报告命名cache的使用情况 -p 报告调页活动的使用情况 -q 报告运行队列和交换队列的平均长度 -R 报告进程的活动情况 -r 报告没有使用的内存页面和硬盘块 -u 报告CPU的利用率 -v 报告进程、i节点、文件和锁表状态 -w 报告系统交换活动状况 -y 报告TTY设备活动状况 http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/sar.html