used内存较大,实际top查看系统进程中并没有占用这么多内存

参考博客:https://blog.youkuaiyun.com/wangcheng6666/article/details/75171952

服务器已经持续运行375天了,查看此服务器15G的内存,几乎全被使用,top查看了进程的内存占用情况,一个个计算下来,总量不超过20%,表示非常奇怪。网上百度了一波,表示是缓存cached引起,于是尝试清除缓存后解决。拷贝上述博客中的解决方案如下:

原因

实际这是缓存原因导致,可以通过命令释放,即上图的cached部分

解决

执行以下命令:

echo 0 >/proc/sys/vm/drop_caches
free -m #看内存是否已经释放掉了。
如果我们需要释放所有缓存,就输入下面的命令:
echo 3 > /proc/sys/vm/drop_caches

0-3的参数含义:

设置值说明:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存

注意

重启后会恢复原样,可以通过脚本定期执行echo 3 > /proc/sys/vm/drop_caches,释放缓存

内存正常释放了,但是swap空间还是没有改变,使用如下两命令可释放swap。

swapoff -a

swapon -a

 

 

 

<think>我们正在解决CentOS7.9系统中出现的高内存占用但无明显进程占用的问题。根据用户提供的引用,我们可以使用一些命令来检查内存使用情况。但是,用户反映没有明显进程占用内存,因此我们需要考虑其他可能的原因,如缓存、缓冲区、内存泄漏或内核占用等。步骤1:使用top命令查看内存使用情况首先,我们可以使用top命令查看各个进程内存占用情况。按内存使用排序(按Shift+M)可以快速找出占用内存高的进程。如果没有发现明显的高内存进程,那么可能是系统缓存或缓冲区占用内存。步骤2:理解内存使用分类在Linux系统中,内存使用包括:-已用内存used):包括应用程序使用的内存和缓存(cache)、缓冲区(buffer)中正在使用的部分。-缓存(cache)和缓冲区(buffer):这部分内存系统为了提高性能而使用的,当应用程序需要时可以被释放。-可用内存(available):这是系统可用内存的估计值,包括空闲内存和可回收的缓存/缓冲区。步骤3:使用free命令查看内存整体使用执行命令:```bashfree-h```观察输出,重点关注:-`total`:内存-`used`:已用内存-`free`:空闲内存-`shared`:共享内存-`buff/cache`:缓存和缓冲区-`available`:可用内存如果`buff/cache`很高,而`available`也较高,那么说明系统利用内存做了缓存,这是正常现象,不需要担心。步骤4:检查slab内存占用如果缓存和缓冲区不高,但内存占用依然很高,可能是内核的slab分配器占用内存。我们可以使用`slabtop`命令查看:```bashslabtop-sc```(按`c`可以按缓存大小排序)步骤5:检查/proc/meminfo通过查看`/proc/meminfo`可以获取更详细的内存信息:```bashcat/proc/meminfo```关注以下字段:-`Slab`:内核数据结构缓存-`SReclaimable`:可回收的Slab-`SUnreclaim`:不可回收的Slab-`Buffers`:缓冲区-`Cached`:缓存-`Shmem`:共享内存步骤6:使用ps命令查看进程内存使用ps命令内存排序查看进程:```bashps-eopid,user,%mem,%cpu,rss,comm,args--sort=-%mem|head-n20```(这里rss是实际占用内存)步骤7:考虑内存泄漏如果以上步骤都没有找到明显的高内存进程,可能是内核或某个进程存在内存泄漏。可以尝试重启系统,看内存是否恢复正常。如果重启后内存正常,但运行一段时间后内存逐渐升高,则可能存在内存泄漏。步骤8:使用工具分析使用内存分析工具如`smem`(可能需要安装):```bashsmem-srss-r```步骤9:检查内核日志查看内核日志,寻找内存相关的错误或警告:```bashdmesg|grep-imemorydmesg|grep-i"outofmemory"```步骤10:考虑透明大页(THP)问题在某些情况下,透明大页(TransparentHugePages)可能会导致内存问题。可以检查THP状态:```bashcat/sys/kernel/mm/transparent_hugepage/enabled```如果为`always`,尝试设置为`never`或`madvise`,然后观察内存使用情况。设置方法(临时):```bashechonever>/sys/kernel/mm/transparent_hugepage/enabledechonever>/sys/kernel/mm/transparent_hugepage/defrag```永久设置需修改`/etc/default/grub`,在`GRUB_CMDLINE_LINUX`中添加`transparent_hugepage=never`,然后更新grub重启。步骤11:检查是否有内存被硬件保留某些硬件(如显卡)可能会保留一部分内存。可以通过`dmesg`查看启动时的内存分配情况。结:在没有明显进程占用内存的情况下,通常是因为系统内存用于缓存和缓冲区以提高性能。如果确认不是缓存问题,则可能需要深入检查内核层面的内存分配。根据用户提供的引用,我们主要参考了top、pmap、ps等命令的使用,但用户的问题是无明显进程占用内存,因此我们扩展了其他可能的原因和检查方法。相关问题:1.如何区分Linux系统中的缓存(cache)和缓冲区(buffer)?2.在CentOS7.9中如何诊断内存泄漏?3.透明大页(THP)对系统性能有何影响?如何调整?</think>### CentOS 7.9 高内存占用但无实际进程的解决方案 当系统显示高内存占用但未发现明显进程时,通常由以下原因引起: #### 1. **检查系统缓存和缓冲区占用** Linux 会利用空闲内存做磁盘缓存(Cache)和缓冲区(Buffer),这些内存可被应用随时回收: ```bash free -h ``` - 查看 `buff/cache` 列:若该值很高,说明内存系统缓存占用 - 可用内存 = `free` + `buff/cache` 中可回收部分 #### 2. **检测内核内存泄漏** Slab 内存(内核数据结构缓存)可能泄漏: ```bash slabtop -s c # 按缓存大小排序 cat /proc/meminfo | grep -E "SReclaimable|SUnreclaim" ``` - 若 `SUnreclaim` 值异常高,可能是内核模块内存泄漏 #### 3. **分析隐藏进程** ```bash # 检查所有进程内存(按RSS排序) ps -eo pid,user,rss,%mem,comm,args --sort=-rss | head -n 20 # 检查短时进程(需持续监控) atop -m # 动态内存监控工具 ``` #### 4. **透明大页(THP)问题** THP 可能导致内存碎片化: ```bash cat /sys/kernel/mm/transparent_hugepage/enabled ``` - 若显示 `[always]`,尝试禁用: ```bash echo never > /sys/kernel/mm/transparent_hugepage/enabled ``` #### 5. **检查共享内存** ```bash ipcs -m # 查看共享内存段 df -h /dev/shm # 检查tmpfs使用 ``` #### 6. **内核内存诊断** ```bash cat /proc/meminfo | grep -E "KernelStack|PageTables|VmallocUsed" dmesg | grep -i "out of memory" # 检查OOM日志 ``` #### 7. **应用级内存泄漏检测** 使用 Valgrind 检测可疑进程: ```bash valgrind --leak-check=full --show-leak-kinds=all [应用程序路径] ``` ### 常见问题定位流程 ```mermaid graph TD A[发现高内存占用] --> B{free -h} B -->|高buff/cache| C[正常缓存行为] B -->|低buff/cache| D[检查进程内存] D -->|无高内存进程| E[检查slab内存] E -->|高SUnreclaim| F[内核内存泄漏] E -->|正常| G[检查共享内存/THP] G --> H[应用内存泄漏检测] ``` ### 优化建议 1. **调整缓存策略**:修改 `/etc/sysctl.conf` ```ini vm.vfs_cache_pressure=100 # 提高缓存回收优先级 vm.swappiness=10 # 减少交换倾向 ``` 执行 `sysctl -p` 生效 2. **定期清理缓存**(仅测试环境): ```bash sync; echo 3 > /proc/sys/vm/drop_caches ``` 3. **升级内核**:老版本内核可能存在内存管理缺陷 ```bash yum update kernel ``` > **重要提示**:系统缓存(buff/cache)占用高通常是正常优化行为,实际可用内存 = `free` + `可回收缓存`。只有伴随性能下降时才需干预[^1]。 --- ### 相关问题 1. Linux 系统中 buff/cache 与应用程序内存有何本质区别? 2. 如何区分 CentOS 中的内存泄漏是用户态应用还是内核引起的? 3. 透明大页(THP)在哪些场景下会导致性能下降?如何针对性优化? 4. 除了 `free` 和 `top`,还有哪些专业工具可用于分析 Linux 内存分布? [^1]: 关于 top 命令内存指标的解释,参考: [CentOS 7 内存查看方法](https://www.cnblogs.com/gaojun/p/3406096.html) [^2]: 服务管理命令参考: [CentOS 7.9 Redis 管理](service-redis-start) [^3]: 防火墙状态检查方法: [CentOS 7.9 防火墙图示]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值