总是有很多朋友对Linux内存管理有疑问,以前的日志似乎并没有消除所有人的疑虑。在核心的新版本中,似乎提供了针对此问题的新解决方案,我将其转发以供您参考。最后,我也对此方法发表了意见,欢迎大家一起讨论。
在Linux下频繁访问文件时,物理内存将很快用完。程序结束时,内存将不会正常释放,但将始终用作缓存。似乎很都在问这个问题,但是他们没有看到任何好的解决方案。所以让我谈谈这个问题。
一、正常情况
让我们先讨论一下免费命令:
引用[root @ server〜]#免费-m
已使用的可用免费共享缓冲区总数
Mem:249 163 86 0 10 94
-/ +缓冲区/缓存:58 191
掉期:511 0 511
其中:
请参阅总内存量
used已使用的内存数量
free可用内存数量
共享的多个进程共享的内存总量
缓冲区缓冲区高速缓存和高速缓存的页面高速缓存磁盘高速缓存大小
缓冲区/缓存的内存量:used-buffers-cached
+缓冲区/缓存内存编号:空闲+缓冲区+缓存
可用内存=可用内存+缓冲区+缓存。
有了这个基础,我们可以知道我当前使用的是163MB,空闲的是86MB,缓冲区和缓存的分别是10MB和94MB。
然后让我们看一下如果我复制文件时内存会发生什么情况。
引用[root @ server〜]#cp -r / etc〜/ test /
[root @ server〜]#免费-m
已使用的总可用共享缓冲区已缓存
Mem:249 244 4 0 8 174
-/ +缓冲区/缓存:62187
掉期:511 0 511

我的命令执行结束后,使用的是244MB,可用的是4MB,缓冲区是8MB,缓存的是174MB,我的天哪,它们都被缓存吞噬了。不用担心,这是为了提高文件读取效率。
为了提高磁盘访问效率,Linux进行了一些仔细的设计。除了缓存dentry(用于VFS以加速文件路径名到inode的转换)之外,它还采用两种主要的Cache方法:Buffer Cache和Page Cache。前者用于读取和写入磁盘块,而后者用于读取和写入文件索引节点。这些缓存有效地缩短了I / O系统调用(如读取,写入,getdents)的时间。
所以有人说过一段时间后,Linux会自动释放使用的内存。等待片刻后,让我们再次尝试释放是否有发布?
引用[root @ server test]#free -m
已使用的可用免费共享缓冲区总数
Mem:249 244 5 0 8 174
-/ +缓冲区/缓存:61188
掉期:511 0 511
似乎什么都没有改变。 (实际上,内存的管理也与交换有关)
那么我可以手动释放此内存吗?答案是肯定的!
二、手动释放缓存
/ proc是一个虚拟文件系统,我们可以在其上使用读写操作作为与内核实体进行通信的一种方式。换句话说,可以通过修改/ proc中的文件来调整内核的当前行为。然后,我们可以通过调整/ proc / sys / vm / drop_caches释放内存。操作如下:
参考[root @ server test]#cat / proc / sys / vm / drop_caches
首先,/ proc / sys / vm / drop_caches的值,默认值为0。
引用[root @ server test]#sync
手动执行sync命令(描述:sync命令运行sync子例程。如果必须停止系统,请运行sync命令以确保文件系统的完整性。sync命令将所有未写入的系统缓冲区写入磁盘。包含修改的索引节点,延迟的块I / O和读写映射文件)
参考[root @ server test]#echo 3> / proc / sys / vm / drop_caches
[root @ server test]#cat / proc / sys / vm / drop_caches
3
将/ proc / sys / vm / drop_caches的值设置为3
引用[root @ server test]#free -m
已使用的可用免费共享缓冲区总数
Mem:249 66 182 0 0 11
-/ +缓冲区/缓存:55194
掉期:511 0 511
再次运行free命令,您会发现当前使用的是66MB,free是182MB,缓冲区是0MB,缓存是11MB。然后有效地释放缓冲区和缓存。

◎/ proc / sys / vm / drop_caches的用法说明如下
引用/ proc / sys / vm / drop_caches(因为Linux 2. 6. 1 6)
写入该文件会导致内核丢弃干净的缓存,
内存中的标记和索引节点,导致该内存变为
免费。
释放方法有3种(系统默认值为0,释放后可以返回0)
要释放页面缓存,请使用echo 1> / proc / sys / vm / drop_caches;
免费的牙科和i节点,使用回显2> / proc / sys / vm / drop_caches;
要释放页面缓存,牙科和i节点,请使用echo 3>
/ proc / sys / vm / drop_caches。
因为这是非破坏性的操作并且脏了物体
不可释放,用户应首先运行同步。
三、我的观点
以上文章长期以来对许多用户有关Linux内存管理的问题给出了相对“直观”的回答。我觉得核心开发团队会做出让步。
对于我们需要使用此值还是向用户提及它,我持保留态度。
用该人引用1、可以看到,只有2. 6. 16之后的核心版本才提供此值,该版本是操作系统的旧版本,例如红旗DC 5. 0、 RHEL 4. x没有先前版本;
2、如果我观察系统内存是否足够,我仍然打算查看swap的使用率和si / so两个值的大小;
用户常见的问题是,为什么免费的软件这么少?关闭应用程序后是否没有释放内存?
但是实际上,我们都知道这是因为Linux管理内存的方式不同于Windows。少量的可用空间并不意味着内存不足。您应该查看free第二行的最后一个值:
报价-/ +缓冲区/缓存:58 191
这是系统可用的内存量。
实际项目告诉我们,如果应用程序遇到诸如内存泄漏和溢出之类的问题,则可以通过使用swap来快速判断它,但更难免费查看。
相反,如果这时我们告诉用户修改系统值并“可以”释放内存,则可用空间会很大。用户会怎么想?您是否认为操作系统“有问题”?
因此,我认为由于内核可以快速清除缓冲区或缓存,所以这样做并不难(从上面的操作可以清楚地看出),但是内核却没有这样做(默认值为0),我们不应该随便更改它。
在正常情况下,当应用程序在系统上稳定运行时,自由值将保持稳定值,尽管它似乎相对较小。
当内存不足时,应用程序无法获得可用内存,OOM错误等,最好还是分析应用程序原因,例如由于用户量过多导致内存不足,应用程序内存溢出等,否则,被迫释放free大小的空Buffer可能只是暂时掩盖了问题。
我认为,除了内存不足的情况外,除非处于软件开发阶段,否则需要临时清除缓冲区以确定应用程序的内存使用情况;或应用程序不再提供支持,即使应用程序确实存在内存问题,并且在不可避免的情况下,请考虑定期清除缓冲区。 (不幸的是,此类应用程序通常在旧的操作系统版本上运行,并且上述操作无法解决。)
我自己的测试
[root @ testserver〜]#uname -a
Linux测试服务器2. 6. 18-16 4. el5#1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux
[root @ testserver〜]#免费-m
已使用的可用免费共享缓冲区总数
Mem:2013 1661 352 0 223 1206
-/ +缓冲区/缓存:231 1782
掉期:2047 0 2047
[root @ testserver〜]#同步
[root @ testserver〜]#同步
[root @ testserver〜]#cat / proc / sys / vm / drop_caches
[root @ testserver〜]#echo 3> / proc / sys / vm / drop_caches
[root @ testserver〜]#cat / proc / sys / vm / drop_caches
3
[root @ testserver〜]#免费-m
已使用的可用免费共享缓冲区总数
Mem:2013 100 1913 0 0 14
-/ +缓冲区/缓存:85 1927
掉期:2047 0 2047
[root @ testserver〜]#
测试成功
将crontab设置为自动执行,如下所示:
#!/ bin / bash
回声3> / proc / sys / vm / drop_caches
睡觉5
回声0> / proc / sys / vm / drop_caches
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-360464-1.html
侦查得好啊
必须反击