linux内存占用大?有没有好的解决办法呀

fhuyi0XCV 数码 5 0

一、如何理解Linux内存一直被大量占用

在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux都将能充分利用起来,发挥了硬件投资带来的好处,而Windows只将其做为摆设,即使增加8GB甚至更大。

Linux的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 cache和 buffers,以此提高数据访问性能。

页高速缓存(cache)是Linux内核实现的一种主要磁盘缓存。它主要用来减少对磁盘的I/O操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。

磁盘高速缓存的价值在于两个方面:第一,访问磁盘的速度要远远低于访问内存的速度,因此,从内存访问数据比从磁盘访问速度更快。第二,数据一旦被访问,就很有可能在短期内再次被访问到。

二、linux占用内存太高***有没有好的解决办法呀

且体的还得看服务器的配置。

一般有如下几种可能:

1)有程序占用大量CPU,使用top命令来检查(看看是否有java程序锁死之类的故障)

2)有程序占用大量内存,使得内存真正不够用了(这个才是真正需要加内存的时候),比如由于MySQL在较大负载下运行容量为GB级别的数据库导致内存不够用,需要给服务器插入更多物理内存

3)磁盘系统读写故障,IO吞吐错误造成CPU负载上升,需要光盘引导进入单用户模式扫描修复磁盘。

但也可以手动进行内存释放,具体操作如下:

[root@dbserver01 mysql]# cat/proc/sys/vm/drop_caches0

首先,/proc/sys/vm/drop_caches的值,默认为0

[root@dbserver01 mysql]# sync

手动执行sync命令(描述:sync命令运行 sync子例程。如果必须停止系统,则运行 sync命令以确保文件系统的完整性。sync命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O和读写映射文件)《Linux就该这么学》一起学习。

[root@dbserver01 mysql]# echo 3>/proc/sys/vm/drop_caches

[root@dbserver01 mysql]# cat/proc/sys/vm/drop_caches

3

将/proc/sys/vm/drop_caches值设为3 [root@dbserver01 mysql]# free-m

三、linux内存不足对性能影响多大

在Windows中,资源管理器查看内存使用情况,如果使用率达到80%以上,那么运行大型程序就会觉得系统不顺畅,因为在内存短缺的情况下使用交换分区,频繁的从磁盘交换页面会大大影响系统性能。而在使用Linux系统时,我们使用free命令查看Linux系统内存使用情况时,会发现内存使用率一直处于较高水平,即使此时系统没有运行很多软件。这是Windows和Linux在内存管理方面的区别。这样看来,Linux系统占用了我们的内存(Linux占用了我的RAM),但这也是其内存管理的特点。

free命令介绍

为了使用自由命令查看我们的实验室文件服务器内存的结果,-M选项表示MB为单位:

第二行输出表示系统内存的使用。

注:前四个术语更好地理解。缓冲区和缓存无法找到正确的单词进行翻译。它们之间的区别在于:

A buffer is something that has yet to be“written” to disk.A cache is something that has been“read” from the disk and stored for later use.

即buffer用于存放要输出到磁盘的数据,而cache是从磁盘读出存放到内存中待今后使用的数据。它们的引入均是为了提供IO的性能。

以上输出的结果可能是第三行,为什么要向用户显示呢?内存使用减去系统缓冲/缓存的内存表示是什么?系统空闲内存添加到缓冲区/缓存的内存中的是什么?

内存的分类

我们将内存分为三类,对于用户和操作系统的使用有不同的术语:

上表中something代表的正是free命令中”buffers/cached”的内存。由于这个内存实际上是从操作系统的角度使用的,所以如果用户想要使用它,那么它可以被用户的程序快速地回收和使用,因此应该从用户的角度将内存划为空闲。

再次返回free命令输出的结果,第三行输出的结果应该是可以理解的,并且该行上的数字从用户的角度表示系统内存的使用。因此,如果使用top或free命令查看系统中还剩下多少内存,那么实际上应该将空闲内存添加到buffer/cached,即实际的系统空闲内存。

buffers/cached好处

Linux内存管理已经做了很多精心的设计,除了dentry缓存之外(对于VFS,为了加快文件路径名到inode的转换),还采用了两种主要的缓存方法:缓冲缓存和页面缓存,目的是提高磁盘IO的性能。从低速块设备读取数据暂时存储在存储器中。即使此时不再需要数据,也可以在下一次应用程序访问数据时直接从存储器读取数据,从而绕过低速块设备,从而提高系统的整体性能。

Linux将充分利用免费内存。在我看来,如果内存是免费的,最好缓存更多的数据。下次程序再次访问数据时,速度会更快。如果程序希望使用内存,并且系统中的内存不足时,那么它不会使用交换分区,而是快速恢复部分缓存,把它们留给用户程序。

因此,正如您所看到的,buffers/cached实际上还是有点用处,而真正的缺点可能是用户认为Linux消耗内存!然而,Linux不会耗尽您的内存,只要您没有使用交换分区,您就应该庆幸您的内存耗尽了,因为Linux会缓存大量数据,也许下次您会从中受益!

实验证明

通过实验验证了以下结论。

我们读了一份大文件,比较两种阅读的实践:

1.首先,生成一个大的1G文件:

2.空缓存:

3.读取此文件并测试所消耗的时间:

4.再次读取文件并测试所消耗的时间:

从上面可以看到,第一次读取这个1G文件需要大约18秒,第二次读取只需0.3秒,增加了60倍!那么你觉得Linux系统还是吃内存吗?

四、Linux系统CPU/内存使用率过高的问题排查

   服务器出现由内存问题引发的故障,例如系统内部服务响应速度变慢、服务器登录不上、系统触发 OOM(Out Of Memory)等。通常情况下当实例内存使用率持续高于90%时,可判断为实例内存使用率过高。CPU/内存使用率过高的问题原因可能由硬件因素、系统进程、业务进程或者木马病毒等因素导致。

  笔者以前写过一篇文章- Linux下的 60秒分析的检查清单,适用于任何性能问题的分析工作,这一篇文章是关于CPU/内存使用率的具体的排查思路总结。

   执行 top 命令后按  M,根据驻留内存大小进行排序,查看“RES”及“SHR”列是否有进程占用内存过高。按 P,以 CPU占用率大小的顺序排列进程列表,查看是否有进程占用cpu过高。

  如果有异常进程占用了大量 CPU或内存资源,记录需要终止的进程 PID,输入k,再输入需要终止进程的 PID,按 Enter。

    另外说明一下,top运行中可以通过 top的内部命令对进程的显示方式进行控制,最常用的是M和P。

    CPU空闲但高负载情况,Load average是 CPU负载的评估,其值越高,说明其任务队列越长,处于等待执行的任务越多。执行ps-axjf命令,查看进程状态,并检查是否存在 D状态进程。D状态指不可中断的睡眠状态,该状态进程无法被杀死,也无法自行退出。若出现较多 D状态进程,可通过恢复该进程依赖资源或重启系统进行解决。

    Linux系统通过分页机制管理内存的同时,将磁盘的一部分划出来作为虚拟内存。而 kswapd0是 Linux系统虚拟内存管理中负责换页的进程。当系统内存不足时,kswapd0会频繁的进行换页操作。换页操作非常消耗 CPU资源,导致该进程持续占用高 CPU资源。

   执行top命令,找到 kswapd0进程。观察 kswapd0进程状态,若持续处于非睡眠状态,且运行时间较长并持续占用较高 CPU资源,执行 vmstat ,free,ps 等指令,查询系统内进程的内存占用情况,重启系统或终止不需要且安全的进程。如果 si,so的值也比较高,则表示系统存在频繁的换页操作,当前系统的物理内存已经不能满足您的需要。  si 表示每秒从交换区写入内存的大小(单位:kb/s), so 每秒从内存写到交换区的大小。

    执行cat/proc/meminfo|grep-i shmem命令查看共享内存。

     buddy可以以页为单位获取连续的物理内存了,即4K为单位。slab负责需要频繁的获取/释放并不大的连续物理内存,比如几十字节。执行cat/proc/meminfo| grep-i SUnreclaim命令查看slab内存。

    标准的 4KB大小的页面外,内存大页管理内存中的巨大的页面,处理较少的页面映射表,从而减少访问/维护它们的开销。执行cat/proc/meminfo| grep-iE"HugePages_Total|Hugepagesize"查看内存大页。

内存使用率计算:

 (Total- available)100%/ Total

(Total- Free- Buffers- Cached- SReclaimable+ Shmem)* 100%/ Total

  cat/proc/meminfo查看信息含义:

抱歉,评论功能暂时关闭!