RHCA RH442实战系列(二)之Linux buffer内存释放

1. 说明

  Linux的内核负责硬件管理,资源调度,进程管理,和资源管理等相关工作,其中内存资源管理做为kernel的一项非常重要的工作。kernel在处理文件时,如打开一个文件,会将文件的元数据信息,即文件名,inode等信息记录在buffer中,后续重复读取相同的文件,则直接冲buffer中读取,这样的机制能够提高速度,此外,对于文件的内容,将会记录在cache中保存,对于buffer和cache,内存会有自动清理的机制,如果buffer和cache一直无法释放,可能导致的原因有:内存泄露,应用程序有问题等原因。

2. 现象说明

生产环境中,使用了两台大硬盘的机器做glusterfs集群,用于openstack的cinder做volume卷的角色,随着时间的推移,发现两台机器的内存利用率超过了95%,上机器上查看时,发现buffer和cache的利用率非常高,如下:

[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         32057      30861       1195          0          6         29
-/+ buffers/cache:          30825       1232            #buffer已经使用了接近30G,只剩下1G左右的空间
Swap:         8191          0       8191

3. 解决方法

  1. 针对buffer和cache过高,只用sync将数据回写到磁盘
[[email protected] ~]# sync && sync && sync
[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         32057      30854       1203          0          7         29
-/+ buffers/cache:          30817       1240            #相比于上次的结果,释放了100M的内存,没有明显的效果
Swap:         8191          0       8191

2. 修改内存对swap的亲和力,转移至swap中

[[email protected] ~]# sysctl -a |grep swap
vm.swappiness = 60                                            #kernel对于swap的亲和力为60,设置为0,则表示直接使用swap空间

#调整swap的亲和力
[[email protected] ~]# sysctl -w vm.swappiness=0
vm.swappiness = 0

[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         32057      30857       1200          0          7         29
-/+ buffers/cache:      30820       1237                      #依旧没有什么明显的效果
Swap:         8191          0       8191

#调整回来
[[email protected] ~]# sysctl -w vm.swappiness=60
vm.swappiness = 60

3. 通过以上的两种方法尝试,都没有达到释放内存的效果,上面的方法,都是比较保守可用的方法,以下通过修改内核参数的方式释放内存

[[email protected] ~]# sysctl -a |grep drop_caches
vm.drop_caches = 0                                            #默认为0,表示默认的机制

#修改为1,释放pagecache,执行前,执行多次sync
[[email protected] ~]# sync && sync && sync && sysctl -w vm.drop_caches=1
vm.drop_caches = 1
[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         32057      30836       1221          0          0         14
-/+ buffers/cache:      30821       1236                       #依旧没有明显的内存资源释放
Swap:         8191          0       8191

#修改为3,释放 pagecache, dentries and inodes
[[email protected] ~]# sync && sync && sync && sysctl -w vm.drop_caches=3    

[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         32057       1715      30342          0         12         34
-/+ buffers/cache:       1667      30389                      #效果立竿见影!!!!,直接释放了30G的内存
Swap:         8188          0       8188

#修改回原始值,千万记得!!
[[email protected] ~]# sysctl -w vm.drop_caches=0

4. 观察监控内存的使用情况

4. 参数说明

Drop Caches

Kernels 2.6.16 and newer provide a mechanism to have the kernel drop the page cache and/or inode and dentry caches on command, which can help free up a lot of memory. Now you can throw away that script that allocated a ton of memory just to get rid of the cache...

To use /proc/sys/vm/drop_caches, just echo a number to it.

To free pagecache:

# echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

# echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

This is a non-destructive operation and will only free things that are completely unused. Dirty objects will continue to be in use until written out to disk and are not freeable. If you run "sync" first to flush them out to disk, these drop operations will tend to free more memory.

5. 结论

关于内存的释放,以上通过暴力的方式,直接释放了保存在内存中的inode和pagecache,关于是否造成数据丢失,还在进步一观察中,如果有发现类似的状况,建议重启进程,或检查应用程序是否有内存泄露等问题,至于是否能够执行,请读者谨慎,仅作参考。

时间: 2024-10-18 12:22:17

RHCA RH442实战系列(二)之Linux buffer内存释放的相关文章

[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口(转)

转自:[CXF REST标准实战系列] 二.Spring4.0 整合 CXF3.0,实现测试接口 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现WebService接口层 4.撰写HTTPClient 客户端,并实现简单调用 介绍RESTful架构风格 REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的.无状态的.可缓存的.统一接口.分层系统和按需编码.其具有跨语言和跨平台的优势. REST是一

SQL Server 性能优化实战系列(二)

SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你看到表的记录如下图所示,你最先想到的是什么呢? (图1:数据列表) 你看到这些数据,是不是觉得这样的设计既浪费了存储空间,又使得这个列的索引增大,查询起来更慢,你也想使用一些其它的数据类型来代替这个datetime吧? 其实大家都是这么想的,这个方向是100%正确的,但是在写这篇文章以前,我进入了两

MP实战系列(二)之集成swagger

其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同的资源有不同的请求标识.例如PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH等. 对于技术的初学,最好的话还是建议去官网,官网最详细也最权威,虽然不少博客对此有挺好的解说,但还是强烈建议去官网,不要求仔仔细细阅读,至少读个大概. 对于目前,有人要问我swagger能做什么

openstack运维实战系列(二十)之neutron创建网络并指定vlan号码

1. 背景说明   neutron在openstack中负责instance的网络,如虚拟机内部网络,虚拟机外部网络等,和实体网络相类似,openstack中的网络也存在路由器router,交换机switch,网络network,子网subnet,端口port等概念,这些功能都有neutron来完成,neutron由有个不同的插件plugins组成,如二层插件neutron-openvswitch-agent,三层插件neutron-l3-agent,动态地址分配neutron-dhcp-age

Node.js 切近实战(十二) 之Linux部署

之前的话我们的项目都是跑在windows上,今天我们要将我们的程序跑到linxu机器上.在看linux部署之前,我们先看一下node.js类似于asp.net mvc的过滤器或者叫拦截器.在app.js中我们加入如下代码 var beforeRequest = function (req, res, next) {     if (req.originalUrl == '/'          || req.originalUrl == '/login'          || req.orig

RHCA CL220实战系列(一)之KVM部署CloudForms

1. 概述 红帽公司推出了混合云CloudForms解决方案,redhat的宗旨在于通过CloudForms能够管理所有的基础架构设施如RHEV,VMware和云(AWS和OpenStack),实现集中化管理平台.CloudForms由Engine引擎,VMDB虚拟数据库等组成,其中Engine作为CloudForms中核心功能,负责CloudForms的日常管理工作. CloudForms Engine简称CFME,是一个已经制定好的虚拟机,通过部署该虚拟机,可以快速的部署CloudForms

[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现WebService接口层 4.撰写HTTPClient 客户端,并实现简单调用 介绍RESTful架构风格 REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的.无状态的.可缓存的.统一接口.分层系

jvm系列 (二) ---垃圾收集器与内存分配策略

回顾 上文介绍了jvm的内存区域以及介绍了内存的溢出情况. jvm区域分为5个,线程独有:虚拟机栈,本地方法栈,程序计数器.线程共享:方法区,堆 两种溢出:栈溢出(StackOverflowError),OutOfMemoryError(OOM) 为什么学习垃圾收集 看起来jvm好像一切帮你做好,但是当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这种自动化的技术进行监控和调节. 根据实际应用需求,选择最优的收集方式才能更高的性能. 垃圾收集的区域 虚拟机栈,本地方法栈,程序计数器是线程私

ElasticSearch实战系列四: ElasticSearch理论知识介绍

前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是一个实战派,不太喜欢讲这些理论知识,因为这块可以查看官方文档,那里会写得非常详细,但是在使用了ElasticSearch之后,发现有的知识点需要掌握一定的理论知识才能理解,对于初学者来说有的不好理解,因此写下该篇文章,希望读者在看完之后能够有所帮助. ElasticSearch 理论知识介绍 Ela