云服务器免费试用

linux服务器内存占用高(linux服务器占用率)

服务器知识 0 904

本文目录:

  • 1、linux服务器内存使用率过高
  • 2、正确理解linux运行内存过高的问题以及free命令
  • 3、Linux中Cache内存占用过高清理
  • 4、Linux中Cache内存占用过高解决办法
  • 5、Linux系统CPU/内存使用率过高的问题排查

linux服务器内存使用率过高

这个服务器内存使用率过高的话,说明是有的系统软件正在高度的占用内存,你可以把它找到,然后关闭的

正确理解linux运行内存过高的问题以及free命令

周末闲来无事,查看了一下服务器的运行状态。发现通过监控页面可以看到,服务器的运行内存一直占用在98%左右,难道服务器出现什么问题了???

后来通过了解到,linux系统和平时使用的windwos系统内存运行机制不同。

windows系统的内存是程序运行过程中需要使用才会用到,不用时空闲着。所以当内存使用率过高时,需要检查是否超负载运行。解决方法是停止掉一些进程。

linux系统中,是进程优先使用内存,而不是磁盘。这样会加快读取速度。当有新的进程启动时,再从内存中开辟出一定空间,为新的进程所用。即使进程退出,也不会立刻从内存中清理掉,这样可以加快下次启动进程的速度。所以内存一直是使用率很高的。这是linux系统的独特之处,初使用linux系统的同学需要转换一些思维。不用为linux的内存使用率高而担心。

在图1中,第三行反映出真实内存使用率为12.5%

再介绍一个linux查看内存的命令, free

free命令可以显示当前系统为使用和以使用的内存情况,还可以显示被内存使用的内存缓冲区。

free命令默认以K单位来显示内存使用情况

Mem行显示数据

total:总内存大小

used:已使用内存大小

free:当前空闲内存大小

shared:多个进程共享的内存总额

buffers/cached:缓存内存数据

-/+ buffers/cache行数据显示

这一行的数据代表应用内存使用情况,可理解为真实内存使用情况。如图1中第三行数据。

used:当前(真实)使用内存总数

free:当前(真实)空闲内存总数

-/+ buffers/cache:    1025604    7165460可理解为当前已经使用的内存为1/8,计算公式used/(used+free)。也就是12.6%左右。

Swap代表交换分区,不做过多详解

free常用参数:

free -b      #以Byte为单位显示内存使用情况

free -k      #以KB为单位显示内存使用情况,也是默认参数

free -m      #以MB为单位显示内存使用情况

free -g      #以GB为单位显示内存使用情况

free -o      #不显示应用(真实)内存使用情况列,不推荐

free -s数字 #间隔数字秒数刷新显示内存使用情况

free -t      #显示内存总和列

free -V     #显示当前版本

Linux中Cache内存占用过高清理

在Linux中每次用free查看的时候,发现free的空间都只有500M左右。同样的环境32G只剩下这点,64G的也只剩下这么一点。后来发现都被Cache占用了,因为服务器上运行了Kafka环境,每周的日志文件都有一二百G的,估计就是他占用了page cache吧。

Free中的buffer和cache:(它们都是占用内存):

buffer : 作为buffer cache的内存,是块设备的读写缓冲区

cache: 作为page cache的内存, 文件系统的cache

如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。

Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。也可以用动释放,释放的时候需要对cache中的数据跟对应文件中的数据一致。

释放的方式有下以几种

一般情况下释放pagecache就可以了。这样可以写一个sh脚本来在服务器空闲的时候定时执行

使用crontab来设置定时任务,如每天4点开始清理

本文参考:

Linux中Cache内存占用过高解决办法

在Linux系统中,我们经常用free命令来查看系统内存的使用状态。

默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大。这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少)。一般情况下,对此命令输出的理解可以分这几个层次:

1.  不了解。这样的人的第一反应是:天啊,内存用了好多,70个多G,可是我几乎没有运行什么大程序啊?为什么会这样?Linux好占内存!

2.  自以为很了解。这样的人一般评估过会说:嗯,根据我专业的眼光看的出来,内存才用了17G左右,还有很多剩余内存可用。buffers/cache占用的较多,说明系统中有进程曾经读写过文件,但是不要紧,这部分内存是当空闲来用的。

3.   真的很了解。这种人的反应反而让人感觉最不懂Linux,他们的反应是:free显示的是这样,好吧我知道了。神马?你问我这些内存够不够,我当然不知道啦!我怎么知道你程序怎么写的?

4.   根据目前网络上技术文档的内容,我相信绝大多数了解一点Linux的人应该处在第二种层次。大家普遍认为,buffers和cached所占用的内存空间是可以在内存压力较大的时候被释放当做空闲空间用的。但真的是这样么?

在论证这个题目之前,我们先简要介绍一下buffers和cached是什么意思:

Free中的buffer和cache:(它们都是占用内存):

buffer : 作为buffer cache的内存,是块设备的读写缓冲区

cache: 作为page cache的内存, 文件系统的cache

如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。

cache是高速缓存,用于CPU和内存之间的缓冲;

buffer

是I/O缓存,用于内存和硬盘的缓冲

buffer和 cache 是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page

cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

明白了这两套缓存系统的区别,就可以理解它们究竟都可以用来做什么了。

Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。

但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行 释放 。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。

在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches 

1

方法是:

echo 1  /proc/sys/vm/drop_caches

当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:

sync //先做同步数据 防止数据部分丢失

echo 1  /proc/sys/vm/drop_caches:表示清除pagecache。

echo 2  /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。

echo 3  /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。

#!/bin/bashecho       "开始清理缓存"

sync;sync;sync        #写入硬盘,防止数据丢失

sleep 10                      #延迟10秒

echo 1 /proc/sys/vm/drop_cachesecho                  "清理结束"

设置定时任务

crontab -e

* 0 * * * /root/cleanBuff.sh                       

crontab -l                   //查看是否设置成功

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查看信息含义:

【linux服务器内存占用高】的内容来源于互联网,如引用不当,请联系我们修改。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942@qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: linux服务器内存占用高(linux服务器占用率)
本文地址: https://solustack.com/12444.html

相关推荐:

网友留言:

我要评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。