记一次服务器内存被写满,变得异常卡顿的事故

本文详述了一次因服务器内存满导致的网页卡顿问题,通过排查确定是内存未正常回收。深入探讨了Linux内存回收机制,包括pagecache、dentries和inodes的概念,以及zone_reclaim_mode、laptop_mode和swappiness参数的影响。通过检查系统参数,发现zone的内存回收未开启。文章总结了内存回收的各种限制条件,并引用了相关资源,强调了进一步学习Linux内存管理知识的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还原下现场:

某天下午, 运营反馈说网页打开很卡。经过排查发现服务器内存被写满,除了内存被写满以后, 其他都是正常的。

  1. 内存大部分都是被used
  2. cache并没有占用多少

处理方案:
首先紧急释放内存

使用命令
echo 3 > /proc/sys/vm/drop_caches

在我的理解上, 内存是会自动回收的。但是这次很明显是并没有回收内存引起的。
所以花了点时间研究了一下内存的回收机制:
Linux 内存回收机制这篇文章给了我很多引发, 特别感谢大神, 让我理解了以前很多不理解的东西。

首先来说下手动释放内存命令:

echo 1 > /proc/sys/vm/drop_caches #free pagecache, use
echo 2 > /proc/sys/vm/drop_caches #free dentries and inodes
echo 3 > /proc/sys/vm/drop_caches #free pagecache, dentries and inodes

pagecahe: 很好理解,就是缓存
dentries: dentries是表示目录的数据结构
inodes: inode是表示文件的数据结构

好吧, 对于以上 dentries 和 inodes的解释我是在不知道他们是干啥的。。先挖坑,以后再填吧。

但至少我发现了这张图
在这里插入图片描述

根据事故原因, 我需要做的就是释放 dentries和inodes,但为什么没有被释放?
** 按图上描述linux有3种释放dentries和inodes的方式: **

  1. 快速释放内存,又分4种情况, 根据参数 /proc/sys/vm/zone_reclaim_mode:
    -. 0x0: 当此参数为0时,会导致快速内存回收只会对最优zone附近的几个需要进行内存回收的zone进行内存回收(说快速内存会解释),而只要不为0,就会对zonelist中所有应该进行内存回收的zone进行内存回收。
    -. 0x1:开启zone的内存回收
    -. 0x2:开启zone的内存回收,并且允许回写
    -. 0x4:开启zone的内存回收,允许进行unmap操作
  2. 直接释放,也分两种情况, 根据参数 /proc/sys/vm/laptop_mode:
    -. 0:允许直接内存回收对匿名页lru链表中的页进行回写操作,并且允许直接内存回收唤醒flush内核线程
    -. 非0:直接内存回收不会对匿名页lru链表中的页进行回写操作
  3. kwapd回收, 根据 /proc/sys/vm/swappiness参数来合理分配 扫描匿名页lru链表和扫描文件页lru链表的比例:
    -. 接近0:进行内存回收时,更多地去扫描文件页lru链表,如果为0,那么就不会去扫描匿名页lru链表。
    -. 接近200:进行内存回收时,更多地去扫描匿名页lru链表。

** 还有3种回收限制:**

-. ALLOC_WMARK_MIN: 内存不足的最低点,如果计算出的可用页面低于该值,则无法进行页面计数(可根据/proc/sys/vm/min_free_kbytes设置);
-. ALLOC_WMARK_LOW: 默认情况下,该值为WMARK_MIN的125%,此时kswapd将被唤醒,可以通过修改/proc/sys/vm/watermark_scale_facto来改变比例值;
-. ALLOC_WMARK_HIGH: 默认情况下,该值为WMARK_MAX的150%,此时kswapd将睡眠,可以通过修改/proc/sys/vm/watermark_scale_facto来改变比例值;


有了上面的几个参数配置,挨个检查:

[root@web03 mysql]# cat  /proc/sys/vm/zone_reclaim_mode
0
[root@web03 mysql]# cat  /proc/sys/vm/laptop_mode
0
[root@web03 mysql]# cat  /proc/sys/vm/swappiness 
60

所以很容易看出来问题是并没有开启zone的内存回收

虽然问题找到了,但是还得学习linux相关知识。
最后感谢 下面两位大神写的文章
Linux 内存回收机制
Linux内存管理,Linux内存管理

### Windows 复制粘贴卡顿的原因分析 Windows 系统中的复制粘贴操作涉及多个系统组件的协同工作,包括文件资源管理器、缓存机制以及底层驱动程序。如果这些组件出现问题,可能导致复制粘贴过程变得缓慢甚至完全停滞。 常见的原因有以下几种: 1. **硬件性能不足**:硬盘读速度较慢(特别是机械硬盘),内存容量较小或虚拟内存设置不合理都会影响文件传输效率[^2]。 2. **后台服务冲突**:某些第三方软件或杀毒工具可能干扰文件系统的正常运作,尤其是在实时监控模式下[^3]。 3. **注册表配置错误**:Win10 中存在一些特定的注册表项会影响文件操作行为,不当修改可能导致异常情况发生[^4]。 4. **病毒或恶意软件感染**:隐藏在系统中的恶意代码可能会占用大量 CPU 或磁盘 IO 资源,从而拖累整个文件处理流程[^1]。 5. **网络共享问题**:如果是跨设备间的数据交换,则需考虑网速瓶颈或是远程服务器负载过高因素的影响. --- ### 解决方案汇总 #### 方法一:优化注册表设置 通过调整注册表参数可以显著改善部分用户的体验效果。具体步骤如下所示: ```reg [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Update] "UpdateMode"=dword:00000000 ``` 上述脚本的作用在于禁用了不必要的更新检测逻辑,默认情况下该项不存在时会被启用。对于频繁遭遇此类困扰的朋友来说值得一试。 > 注意事项:操作前建议先备份现有数据以防万一! #### 方法二:排查并修复潜在威胁 利用微软官方提供的安全扫描工具进行全面体检,并及时清除发现的风险隐患。同时也要确保防病毒产品处于最新状态以便应对新型攻击方式。 #### 方法三:升级存储介质至SSD固态硬盘 相比传统HDD而言,现代NVMe SSD具备更快的速度表现能够极大程度缓解因物理层面限制所引发的各种延迟现象。 #### 方法四:减少无关进程干扰 关闭那些不必要却持续运行的应用程序实例,尤其是那些消耗较多计算能力的任务,这样可以让剩余可用资源更多地分配给当前正在进行的重要活动上比如大文件迁移作业等等。 #### 方法五:针对开发环境特殊状况单独处置 像Visual Studio这类大型集成开发平台内部自带了很多辅助功能模块,它们虽然方便但也容易成为负担所在之处。因此可以通过定制化选项来卸载掉自己很少使用的附加组件进而达到提速目的。 另外还有关于ZSH命令行环境下遇到类似麻烦也可以参照相应文档说明来进行针对性修正措施[^5]: ```bash pasteinit() { OLD_SELF_INSERT=${${(s.:.)widgets[self-insert]}[2,3]} zle -N self-insert url-quote-magic } pastefinish() { zle -N self-insert $OLD_SELF_INSERT } zstyle :bracketed-paste-magic paste-init pasteinit zstyle :bracketed-paste-magic paste-finish pastefinish ``` 以上片段即为一种有效的解决办法之一。 --- ### 结论 综上所述,造成 windows 平台下的复制粘贴动作变迟钝的因素众多且复杂多样,但从实际应用角度来看采取综合手段往往能取得不错成效。希望本文介绍的内容对你有所帮助! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值