Rak*_*kib 16 memory memcached caching redis aws-ec2
刚刚从https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system学习了这三种新技术:
要释放pagecache:
# echo 1 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
要释放dentries和inode:
# echo 2 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
要释放pagecache,dentries和inode:
# echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
我试图了解究竟是什么页面缓冲,dentries和inode.究竟是什么?
释放它们还会删除有用的memcached和/或redis缓存吗?
-
我为什么问这个问题?我的亚马逊EC2服务器RAM在这些日子里被填满 - 在7天内从6%上升到95%.我不得不运行每两周一次的cronjob来删除这些缓存.然后内存使用率再次降至6%.
use*_*003 18
由于有些过于简单化,让我尝试解释一下您的问题的背景,因为有多个答案.
您似乎正在使用目录结构的内存缓存.上下文中的inode是表示文件的数据结构.甲目录项是一个数据结构,它表示一个目录.这些结构可用于构建表示磁盘上文件结构的内存缓存.要获得直接列表,操作系统可以进入dentries - 如果目录在那里 - 列出其内容(一系列inode).如果没有,请转到磁盘并将其读入内存,以便可以再次使用.
该页面缓存可以包含任意内存映射到磁盘块.可以想象,这可以是缓冲的I/O,内存映射文件,可执行文件的分页区域 - 操作系统可以从文件中保存在内存中的任何内容.
您的命令刷新这些缓冲区.
小智 6
我试图了解究竟是什么页面缓冲,dentries和inode.究竟是什么?
user3344003已经给出了该特定问题的确切答案,但仍然需要注意这些内存结构是动态分配的.
当没有更好地使用"空闲内存"时,内存将用于那些缓存,但是当其他"更重要"的应用程序想要分配内存时,会自动清除和释放内存.
不,这些缓存不会影响任何应用程序维护的任何缓存(包括redis和memcached).
我的亚马逊EC2服务器RAM在这些日子里被填满 - 在7天内从6%上升到95%.我不得不运行每两周一次的cronjob来删除这些缓存.然后内存使用率再次降至6%.
可能你错误地解释了这种情况:你的系统可能正在有效地利用它的资源.
为了简化一点:"免费"内存也可以被视为"未使用",甚至更具戏剧性 - 浪费资源:你付出了代价,但却没有使用它.这是一个非常不经济的情况,Linux内核试图对你的"免费"内存进行一些"更有用"的使用.
其策略的一部分涉及使用它来使用各种动态大小的内存缓存来保存各种磁盘I/O. 快速访问缓存可以节省"慢速"磁盘访问,因此这通常是一个有用的想法.
一旦"更重要"的进程想要分配内存,Linux内核就会自动释放这些缓存并使内存可供请求进程使用.因此通常不需要"手动释放"这些缓存.
Linux内核甚至可能决定将其他空闲进程的内存交换到磁盘(交换空间),从而释放RAM用于"更重要"的任务,可能还包括用作某些缓存.
因此,只要您的系统没有主动交换进出,就没有理由手动刷新缓存.
"手动刷新"这些缓存的常见情况纯粹是为了进行基准比较:您的第一个基准运行可能会运行"空"缓存,因此会产生较差的结果,而第二次运行会显示更多"更好"的结果(由于预先温暖的缓存).通过在任何基准运行之前刷新缓存,您将删除"温暖"的缓存,因此您的基准运行更加"公平",可以相互比较.
归档时间: |
|
查看次数: |
13533 次 |
最近记录: |