总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑。而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下。最后,还附上我对这方法的意见,欢迎各位一同讨论。
当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题。
一、通常情况
先来说说free命令:
# free -m
total used free shared buffers cached
Mem: 249 163 86 0 10 94
-/+ buffers/Cache: 58 191
SWAP: 511 0 511
其中:
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 多个进程共享的内存总额
buffers buffer Cache和cached Page Cache 磁盘缓存的大小
-buffers/cache (已用)的内存数:used - buffers - cached
+buffers/cache(可用)的内存数:free + buffers + cached
可用的memory=free memory+buffers+cached
有了这个基础后,可以得知,我现在used为163MB,free为86MB,buffer和cached分别为10MB,94MB。
那么我们来看看,如果我执行复制文件,内存会发生什么变化。
# cp -r /etc ~/test/
# free -m
total used free shared buffers cached
Mem: 249 244 4 0 8 174
-/+ buffers/cache: 62 187
Swap: 511 0 511
在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐,都被cached吃掉了。别紧张,这是为了提高文件读取效率的做法。
为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
那么有人说过段时间,linux会自动释放掉所用的内存。等待一段时间后,我们使用free再来试试,看看是否有释放?
# free -m
total used free shared buffers cached
Mem: 249 244 5 0 8 174
-/+ buffers/cache: 61 188
Swap: 511 0 511
似乎没有任何变化。(实际情况下,内存的管理还与Swap有关)那么我能否手动释放掉这些内存呢?回答是可以的!
二、手动释放缓存
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与Kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下:
# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默认为0。
# sync
手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件)
# echo 3 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
3
将/proc/sys/vm/drop_caches值设为3
# free -m
total used free shared buffers cached
Mem: 249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511
再来运行free命令,会发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB。那么有效的释放了buffer和cache。
有关/proc/sys/vm/drop_caches的用法在下面进行了说明
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to become free.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.
三、我的意见
上述文章就长期以来很多用户对Linux内存管理方面的疑问,给出了一个比较“直观”的回复,我更觉得有点像是核心开发小组的妥协。对于是否需要使用这个值,或向用户提及这个值,我是有保留意见的:
- 从man可以看到,这值从2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC 5.0、RHEL 4.x之前的版本都没有;
- 若对于系统内存是否够用的观察,我还是原意去看swap的使用率和si/so两个值的大小;
用户常见的疑问是,为什么free这么小,是否关闭应用后内存没有释放?但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:-/+ buffers/cache: 58 191,这才是系统可用的内存大小。
实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。相反,如果在这个时候,我们告诉用户,修改系统的一个值,“可以”释放内存,free就大了。用户会怎么想?不会觉得操作系统“有问题”吗?所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。
当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。
我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。(可惜,这样的应用通常都是运行在老的操作系统版本上,上面的操作也解决不了)。而生产环境下的服务器可以不考虑手工释放内存,这样会带来更多的问题。记住内存是拿来用的,不是拿来看的。不像windows。
无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么常常提示虚拟空间不足的原因,你们想想多无聊,在内存还有大部分的时候,拿出一部分硬盘空间来充当内存。硬盘怎么会快过内存,所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少。如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准哦。当然这仅代表我个人意见,也欢迎大家来交流讨论。
以上内容转载于考试大,下面是我写的一个内存释放的脚本,分享给大家:
# vim /root/satools/freemem.sh
#!/bin/bash
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /var/log/mem.log
date >> /var/log/mem.log
echo "Memory usage | [Use:${used}MB][Free:${free}MB]" >> /var/log/mem.log
if [ $free -le 100 ] ; then
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches
echo "OK" >> /var/log/mem.log
else
echo "Not required" >> /var/log/mem.log
将脚本添加到crond任务,定时执行。
# echo "*/30 * * * * root /root/satools/freemem.sh" >> /etc/crondtab
分享到:
相关推荐
在标题和描述中提到的问题,即"Linux下buff/cache占用过高",这是一个常见的系统性能优化问题,尤其是对于运行Java应用或者其他资源密集型服务的云服务器而言。这里我们将深入探讨buff/cache的作用、为何会占用过多...
### Linux-定期清内存缓存-shell脚本 #### 背景与意义 在Linux系统中,内存资源的管理非常重要。随着系统运行时间的增长,内存中的缓存数据可能会占用大量空间,导致可用内存减少,从而影响系统的性能。为了确保...
- **定义**:总线是一组传输路径,用于连接计算机系统中的不同部件,如CPU、内存和输入/输出设备。 - **类型**:主要包括数据总线、地址总线和控制总线。 - **作用**:实现数据在各个部件之间的传输。 **1.4 控制器...
- **2.5.5 定时清理cache**:定期清理系统缓存可以释放更多资源供数据库使用。 - **2.5.6 调整Sysctl.conf**:通过编辑`/etc/sysctl.conf`文件来优化内核参数,提高系统性能。 - **2.5.7 调整Limits.conf**:通过...
ASP制作学生档案管理系统.docx
内容概要:本文详细介绍了应用于工业风机的永磁同步电机的独特设计模型及其优越性能。该电机具有低转矩脉动、低噪音、低温升和长时间带载运行等特点,适用于对电机稳定性要求较高的场所,如医院和实验室。文中不仅探讨了电机的具体参数(如功率550W、转速2800rpm、扭矩1.88Nm、电压220V),还展示了如何通过Python代码进行基本的电机控制,包括初始化和设置转速。此外,文章深入解析了电机内部设计细节,如磁极形状优化、电磁场仿真、温度补偿算法等,揭示了其高性能背后的技术秘密。 适合人群:从事工业自动化、电机设计与控制的研究人员和技术人员,以及对工业风机感兴趣的工程技术人员。 使用场景及目标:①优化现有工业风机系统的性能;②开发新型高效的工业风机;③理解和掌握永磁同步电机的设计原理和控制方法。 其他说明:文中提供的代码片段和设计思路有助于读者更好地理解和应用永磁同步电机技术,同时也强调了实际应用中的注意事项,如温度控制和转矩脉动补偿。
内容概要:本文详细介绍了利用MATLAB进行滚动轴承故障诊断的方法,重点在于采用经验模态分解(EMD)和样本熵相结合的方式提取故障特征。首先,通过对来自西储大学的标准轴承振动数据进行EMD分解,将复杂的振动信号分离成多个固有模态函数(IMF)分量。然后,针对每个IMF分量计算其样本熵值,以此作为特征向量的一部分。最终形成的特征向量可用于进一步的故障分类与识别。文中还讨论了一些实用技巧,如如何选择有效的IMF分量、优化样本熵计算效率等。 适合人群:机械工程领域的研究人员和技术人员,尤其是那些从事机械设备健康监测和故障诊断工作的专业人士。 使用场景及目标:适用于需要对滚动轴承进行精准故障诊断的应用场合,旨在提高故障检测的准确性并减少误判的可能性。通过这种方法,可以帮助维护团队及时发现潜在问题,预防意外停机,保障设备安全运行。 其他说明:作者提供了详细的MATLAB代码示例,便于读者理解和实践。此外,还指出了实践中可能会遇到的一些挑战及其解决方案,例如EMD的端点效应、样本熵对数据长度的敏感性等问题。
XPDF是一个开源的PDF查看、提取和转换工具套件,使用C++编写,支持多种操作系统,包括Linux、Unix、OS/2、Windows和Mac OS X1。XPDF不仅是一个PDF查看器,还包含多个实用工具,如文本提取器、图像转换器和HTML转换器等,内置工具包含pdftohtml、pdftotext、pdftopng、pdftops等,支持命令行调用,可实现自主开发程序的自动化。
Notepad++自用主题
内容概要:本文详细介绍了如何利用昆仑通态触摸屏通过RS485总线采用Modbus协议控制三菱变频器的方法。首先,文中讲解了硬件连接的具体步骤,包括正确的接线方法以及终端电阻的设置。接着,深入探讨了软件配置部分,如创建Modbus RTU父设备、设置通信参数(波特率、校验位等),并强调了三菱变频器地址偏移量的特殊处理。此外,提供了具体的编程实例,涵盖启动变频器、设置频率、读取运行状态等功能的实现。还提到了一些常见的调试技巧和注意事项,例如使用ModScan工具进行抓包验证、确保站号唯一性、正确处理浮点数等问题。最后,分享了一些高级应用场景,如通过配方存储快速切换生产参数,提高生产线灵活性。 适合人群:从事工业自动化领域的工程师和技术人员,特别是有志于掌握Modbus通讯协议及其在实际工程项目中应用的人士。 使用场景及目标:适用于需要集成昆仑通态触摸屏与三菱变频器进行远程控制和监测的小型到中型工业控制系统。主要目的是简化系统架构,降低成本,提升系统的可靠性和易用性。 其他说明:文中不仅提供了理论指导,还包括大量实战经验和代码片段,帮助读者更好地理解和实施相关技术。
CADASIL病临床探讨.docx
内容概要:本文详细介绍了STM32 IAP(In Application Programming)固件升级的具体实现方法,尤其强调了串口环形队列的应用。首先,文章阐述了IAP的整体流程,分为接收新固件、校验并写入Flash以及跳转到新程序执行三个主要阶段。接着,深入探讨了环形缓冲区的设计,包括头尾指针的volatile修饰、取模运算实现自动回卷、缓冲区满的判断逻辑等。此外,还讲解了Flash编程时需要注意的问题,如以半字为单位写入、内存对齐、擦除页面等。最后,讨论了跳转到新程序的关键步骤,如关闭中断、重置向量表、初始化堆栈指针等。文中还提到了一些实用技巧,如CRC校验、超时处理、状态机解析数据包等。 适合人群:具有一定嵌入式开发经验的工程师和技术爱好者。 使用场景及目标:适用于需要进行远程固件升级的STM32项目,旨在提高系统的灵活性和维护效率,减少物理接触设备的需求。 其他说明:本文提供了大量代码片段和实践经验,帮助读者更好地理解和应用IAP技术。
内容概要:本文详细介绍了利用MotorCAD进行外转子式永磁同步电机设计的具体步骤和技术要点。针对一款55kW、220rpm、42极36槽的电机,文章深入探讨了散热设计、极槽配合选择、绕组设计、磁钢尺寸优化以及电磁方案验证等方面的内容。通过具体的参数设置和仿真测试,展示了如何提高电机的功率密度、效率和稳定性。同时,文中还分享了一些实用的经验和技巧,如通过调整极弧系数和采用特殊的绕组配置来减少齿槽转矩脉动,从而确保电机在低速大扭矩应用场景中的优异性能。 适合人群:从事电机设计、制造及相关领域的工程师和技术人员,尤其是对外转子式永磁同步电机感兴趣的读者。 使用场景及目标:适用于需要设计高性能、低速大扭矩电机的工程项目,旨在帮助工程师掌握高效的设计方法和优化策略,以应对实际应用中的挑战。 其他说明:文章不仅提供了详细的参数设置指导,还分享了许多实践经验,有助于读者更好地理解和应用相关技术。此外,文中提及的所有工程文件均已上传至GitHub,方便读者进一步研究和参考。
内容概要:本文详细介绍了基于Simulink仿真的虚拟电网磁链定向(VFOC)和电压定向控制(VOC)两种电力电子变换器控制策略。首先探讨了主电路拓扑及其核心模块如虚拟磁链观测器的设计,强调了积分器漂移问题及解决方案。接着深入讲解了坐标变换模块的具体实现,指出常见的相位错误及修正方法。随后讨论了电流环和电压环的PI参数整定技巧,分享了实际调试中的经验和优化方法。最后展示了仿真波形,比较了VFOC和VOC在不同条件下的性能表现。 适合人群:从事电力电子、自动化控制领域的工程师和技术人员,尤其是对Simulink仿真感兴趣的读者。 使用场景及目标:帮助读者理解和掌握VFOC和VOC的工作原理及实现方法,提高实际项目中的控制系统设计能力。具体应用场景包括但不限于新能源并网、电机驱动等领域。 其他说明:文中提供了大量实用的技术细节和调试经验,有助于读者在实践中避免常见错误,提升仿真实验的成功率。同时提醒读者关注硬件级细节如死区补偿等,以获得更好的控制效果。
花卉数据集(Oxford-102 Flower—102 Category Flower Dataset).zip
内容概要:本文详细介绍了三菱FX3U系列PLC用于XZ轴伺服定位的程序设计及其应用实例。程序分为三个主要模块:轴参数初始化、原点回归和定位运动控制。文中提供了具体的梯形图代码示例,涵盖了加减速时间设置、绝对定位指令、原点回归逻辑、手动控制、自动运行、异常处理等方面的内容。此外,还分享了一些调试经验和实用技巧,如脉冲量计算、安全联锁设计以及扩展性和维护便利性的考虑。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对三菱PLC和伺服控制系统有一定了解的人。 使用场景及目标:适用于需要进行高精度XZ轴伺服定位控制的自动化设备开发和维护。目标是帮助读者掌握三菱FX3U系列PLC的编程方法,提高设备的稳定性和可靠性。 其他说明:文中提到的程序已在多个实际项目中得到验证,能够实现±0.0mm级别的定位精度。对于初学者来说,建议逐步调试各模块的功能,确保每个环节正常工作后再进行整体集成。
2025年计算机二级无纸化选择题题库.doc
内容概要:本文详细介绍了电动汽车踏板测试机的开发过程和技术要点。主要围绕LabVIEW平台,结合研华PCI-1220U运动控制卡和PCI-1716L数据采集卡,以及西门子S7-1200 PLC的安全联锁,构建了一个高效稳定的测试系统。文中涵盖了运动控制、数据采集、PLC通信、包络控制算法、数据追溯等多个方面的具体实现细节和技术难点。特别是针对硬件同步、数据处理优化、异常检测等方面进行了深入探讨,并提供了实用的代码示例。 适合人群:从事工业自动化、嵌入式系统开发的技术人员,尤其是对LabVIEW有一定了解的研发人员。 使用场景及目标:适用于需要进行复杂机电一体化系统集成的场合,如汽车零部件测试、工业机器人控制等领域。目标是帮助工程师快速掌握多设备协同工作的关键技术,提高系统的可靠性和性能。 其他说明:文章不仅分享了具体的编程技巧,还强调了工程实践中常见的陷阱和应对策略,对于希望深入了解工业控制系统的读者非常有价值。
内容概要:本文详细介绍了QPSK(四相移键控)调制方法及其在瑞利信道和高斯信道下的误码率(BER)性能分析。首先展示了QPSK星座图的绘制方法,接着构建了一个简化的QPSK发射机模型,用于将二进制比特流映射到相应的星座点。随后,分别实现了两种信道模型:高斯白噪声信道(AWGN)和瑞利信道,并探讨了它们对传输信号的影响。文中通过大量实验数据对比了这两种信道环境下QPSK系统的误码特性,揭示了瑞利信道由于存在多径效应而导致更高的误码率。此外,还讨论了与其他调制方式如BPSK、16QAM相比,QPSK在频谱效率方面的优势以及抗噪能力。 适合人群:从事无线通信领域的研究人员和技术爱好者,尤其是那些希望深入了解数字调制技术和信道建模的人士。 使用场景及目标:适用于教学演示、科研项目或个人学习,旨在帮助读者掌握QPSK调制的基本原理、信道传播特性及其对通信系统性能的影响。通过对不同信道条件下误码率的测量,使读者能够评估各种调制方案的选择依据。 其他说明:文中提供了详细的Python代码片段,便于读者动手实践并验证相关结论。同时提醒了一些常见的仿真陷阱,如信号能量归一化等问题,有助于提高仿真的准确性。
内容概要:本文详细介绍了SVPWM(空间矢量脉宽调制)过调制算法的原理及其在MATLAB和Python环境下的仿真实现。首先解释了SVPWM的基本概念以及过调制的意义,即在调制比M>1时如何通过调整电压矢量组合来保持输出波形质量。接着给出了具体的算法步骤,包括矢量计算、扇区判断、矢量合成和脉宽计算,并提供了简化版的MATLAB代码示例。此外,还探讨了过调制带来的波形变化特点,如THD升高、波形削顶等,并提出了优化建议,如渐变因子的应用。最后,通过Python代码进一步展示了过调制的不同处理阶段,强调了实际应用中的注意事项。 适用人群:对电力电子、电机控制感兴趣的初学者和技术爱好者,特别是希望深入了解SVPWM过调制算法原理并进行仿真的研究人员。 使用场景及目标:适用于想要理解和研究SVPWM过调制算法的工作机制,以及希望通过仿真工具(如MATLAB、Python)验证算法效果的研究人员。目标是提高对过调制条件下SVPWM算法的认识,掌握其具体实现方法,并能够应用于实际工程项目中。 其他说明:文中不仅有详细的理论讲解,还有丰富的代码实例,帮助读者更好地理解SVPWM过调制算法的实际应用。同时提醒读者关注过调制带来的谐波失真等问题,并提供了一些解决方案。