为何我的LINUX服务器内存利用率很高?正确理解LINUX内存使用机制

今天有人告诉我说linux服务器上的内存快不够用了,128G的内存,马上要用光了。我吓了一跳,这台服务器上的应用现在负载很小啊,怎么利用率会很高呢。先用ZABBIX看了下,内存剩余空间还是很大的,还有117G的空余啊。然后又登陆到服务器上用再看下:

[[email protected] ~]$ top
top - 11:41:03 up 415 days,  1:06,  2 users,  load average: 0.17, 0.12, 0.28
Tasks: 847 total,   1 running, 846 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  0.7%sy,  0.0%ni, 98.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  132035736k total, 130251764k used,  1783972k free,   679012k buffers
Swap: 16777212k total,   448004k used, 16329208k free, 120309904k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 48069 oracle    20   0 59.1g 299m 213m S  7.2  0.2  23205:25 oracle
  5197 root      RT   0  756m  88m  57m S  3.6  0.1  36032:42 osysmond.bin
  5376 root      RT  -5  693m 154m  63m S  2.3  0.1  11577:02 ologgerd
  5924 grid      -2   0 1306m  14m  12m S  1.6  0.0   9131:12 oracle
 48055 oracle    -2   0 59.0g  17m  15m S  1.6  0.0   9306:15 oracle
  6283 root      20   0  968m  28m  12m S  1.3  0.0   5426:41 orarootagent.bi
  4563 root      20   0 1914m  55m  14m S  1.0  0.0   3451:22 ohasd.bin
 48109 oracle    20   0 59.0g 813m 808m S  1.0  0.6   5880:06 oracle
 86867 root      20   0 2273m 240m  10m S  1.0  0.2 458:42.00 ds_am
146406 oracle    20   0 15568 1844  932 R  1.0  0.0   0:00.22 top
  5183 root      20   0 1763m  39m  14m S  0.7  0.0   3144:21 orarootagent.bi     

看了MEM项中,果然是利用率很高,free的不多了。再用free命令看下:

[[email protected] ~]$ free
             total       used       free     shared    buffers     cached
Mem:     132035736  130258872    1776864   59092256     679016  120313028
-/+ buffers/cache:    9266828  122768908
Swap:     16777212     448004   16329208
[[email protected]-sjk1 ~]$ 

也是如此。于是乎,翻开万能的度娘,在网上找到了相关资料。在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

以下是原文内容:

最近有个月经问题,老有人问为何开机后,还没有其他服务,mem就被用完了?是不是内存泄露?是否要重启服务?只能说不要看现象,要看本质才能找到问题的根源。
往往给出这样的结果,怀疑内存用了90%:
Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

这样怀疑很普遍,因为很多人用惯了Windows。Windows下,可以使用任务管理器查看当前进程对于内存的消耗情况。在我看来,Windows物理内存总是留下一定的空间,就算此时物理内存有空闲时,也会让某些程序去使用虚拟内存,目的是在Windows下启动新程序时,直接分配空闲的物理内存,这样子新程序启动速度就较快,而Linux则不然。

而在Linux下,使用top命令看到内存占用情况:

Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

这里的结果显示使用了3.8G的used,占用率达到90%。看看free的结果你还可以对比一下:
$ free -m
total used free shared buffers cached
Mem: 4049 3784 265 0 208 2939
-/+ buffers/cache: 636 3413
Swap: 2588 0 2588

虽然MEM显示了3.7G左右的used,但是(-/+ buffers/cache)减去buffers和cache的结果可以看到,当前进程实际占用内存是636M,而可用空闲(free)内存为3.4G。

可以这么理解:在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

如上面的例子:使用了4G的内存,3.7G被占用,但是buuffer和cached部分作为缓存,可以使用命中率的方式提高使用效率,而且这部分缓存是根据指令随时可以释放的,我们可以认为这部分内存没有实际被使用,也可以认为它是空闲的。

因此查看目前进程正在实际被使用的内存,是used-(buffers+cache),也可以认为如果swap没有大量使用,mem还是够用的,只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的。

根据上述内容,自己算了下,确实剩余内存不少。原来zabbix还是可信的,造成我紧张的原因还是由于自己对linux内存分配机制不清楚导致的。

时间: 2024-09-30 16:54:10

为何我的LINUX服务器内存利用率很高?正确理解LINUX内存使用机制的相关文章

UIWebView内存占用过高、崩溃、内存溢出

UIWebView内存占用过高.崩溃.内存溢出,有需要的朋友可以参考下. 项目当中模拟器上运行UIWebView读取本地杂志,没问题,真机测试经常内存溢出崩溃. 查了资料因为Html里的js 导致的内存泄漏,每次打开一个连接就会把"WebKitCacheModelPreferenceKey"设置成1. UIWebView 增加 - (void)webViewDidFinishLoad:(UIWebView *)webView { [[NSUserDefaults standardUse

linux服务器性能(网卡流量、CPU、内存、磁盘使用率)监控

广义的网站的监控涵盖所有的非业务行为的数据采集与管理,包括数据分析师和产品设计师使用的网站用户行为日志.业务运行数据,以及供运维工程师和开发工程师使用的性能统计数据等. 本文主要是通过shell脚本来收集服务器性能指标,如系统load.内存占用.磁盘IO.CPU占用,并将其写入一个文件中,及时判断应用情况,防患于未然 . 实现步骤如下: 第一步:编写shell脚本,如下: vim check.sh,添加下面脚本之后保存 1 #!/bin/bash 2 #这个脚本使用来统计CPU.磁盘.内存使用率

rabbitmq binary/other_system内存占用很高

最近有台服务器的MQ应用占用内存比较偏高,如下: 但是看控制台本身内存中消息积压并不多, 查看rabbtmqctl发现,binary data和other data占据了绝大部分的内存,如下: {memory, [{total,124441400}, {connection_readers,5548680}, {connection_writers,605560}, {connection_channels,2798608}, {connection_other,7775480}, {queue

正确理解Linux运行级别

通过优锐课的java学习分享中,了解有关Linux运行级别的更多信息-正确的方法! 你可以将Linux运行级别视为操作系统运行的不同"模式".这些模式或运行级别中的每一个都有其自己的已打开或关闭的进程和服务的列表. 从Linux启动时开始,它始终处于某个运行级别. 随着你继续使用计算机,此运行级别可能会更改,具体取决于操作系统需要访问的服务类型. 例如,与仅在系统上运行命令行的情况相比,使用图形用户界面运行Linux机器将需要不同的运行级别. 这是因为图形用户界面将需要访问命令行所隐含

性能分析Linux服务器CPU利用率(转)

1.  指标范围 1.1  User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+sy时间超过85%,则进程可能要花时间在运行队列中等待,响应时间和业务吞吐量会受损害:us过大,说明有用户进程占用很多cpu时间,需要进一步的分析其它软硬件因素:sy过大,说明系统管理方面花了很多时间,说明该系统中某个子系统产生了瓶颈,需要进一步分析其它软硬件因素. 1.2  Wa(wait) 参考值:小于25

一个部署了tomcat服务的linux服务器,运行一段时间后出现内存和空间不足的问题

—— 前段时间项目上的事比较忙,期间笔记都是临时存在本地txt,这些天有点时间了,整理出来,以便日后查看: linux 查看内存使用情况:free -m 释放缓存: /proc/sys/vm/drop_caches 报错:-bash: /proc/sys/vm/drop_caches: Permission denied报错使用下面命令释放缓存:sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' -----------------------------

CPU利用率很高 800%爆了

快下班,问题来了 记一次快下班的记录 快下班了,好友发来了一张照片,如下: 中毒了,没问题,肯定是!!! 开始qq对话解决 **有监控吗,快速查看流量图,看看是否发包或者被发包?** 答曰:没有监控 **那查看一下交换机的接口流量呢?** 答曰:交换机是傻瓜二层的 **那看看防火墙的呢?** 查看流量并没有什么影响. 实在是解决太慢了,而对方的机器是内容,最后通过内容的某太机器,我远程朋友的qq桌面,远程服务器,10分钟后终于连接上了. 开始远程解决问题 1.find / -name cranb

正确理解linux grep 的姿势

简单看题grep --help 问题:想匹配 ttt.sql中 词语为 “8376” 的内容 一般回答: grep -in "8376" ttt.sql 可是这样是想要的嘛?实际过滤出的数据,都不是想要的.只想要8376 这样的单词!!! 25444447:# at 88376417 25444448:#190510 16:11:53 server id 1003006 end_log_pos 88376535 CRC32 0x85c4d815 Table_map: `service`

Linux服务器的那些性能参数指标

Linux服务器的那些性能参数指标 一个基于Linux操作系统的服务器运行的同时,也会表征出各种各样参数信息.通常来说运维人员.系统管理员会对这些数据会极为敏感,但是这些参数对于开发者来说也十分重要,尤其当你的程序非正常工作的时候,这些蛛丝马迹往往会帮助快速定位跟踪问题. 这里只是一些简单的工具查看系统的相关参数,当然很多工具也是通过分析加工/proc./sys下的数据来工作的,而那些更加细致.专业的性能监测和调优,可能还需要更加专业的工具(perf.systemtap等)和技术才能完成哦.毕竟