-
2021-05-10 17:55:58
限制Linux中缓冲区缓存的大小
有没有办法告诉Linux内核只使用一定比例的内存用于缓冲区缓存?我知道/proc/sys/vm/drop_caches可用于临时清除缓存,但是有任何永久设置可以防止它增长到超过例如50%的主存?
我想要这样做的原因是,我有一台运行Ceph OSD的服务器,它不断地从磁盘提供数据,并设法在几个小时内将整个物理内存用作缓冲区缓存。
同时,我需要运行将分配大量(几十GB)物理内存的应用程序。
与流行的看法相反(参见几乎所有关于缓冲区缓存的问题的建议),通过丢弃干净的缓存条目来自动释放内存并不瞬间:
启动我的应用程序可能需要一分钟当缓冲区缓存已满(*)时,
而清除缓存后(使用echo 3 > /proc/sys/vm/drop_caches),相同的应用程序几乎立即启动。
(*)根据Vtune在一个名为pageblock_pfn_to_page的函数中,在启动时间的这一分钟内,应用程序会出现新的内存错误但在内核中花费100%的时间。这个函数似乎与查找大页面所需的内存压缩有关,这让我相信实际上碎片是问题所在。
作者:Wim
最佳答案
如果您不想要绝对限制但只是迫使内核更快地清除缓冲区,那么您应该查看vm.vfs_cache_pressure
此变量控制内核回收用于缓存VFS缓存的内存的趋势,而不是pagecache和swap。增加此值会增加回收VFS缓存的速率。
范围从0到200.将其移向200以获得更高的压力。默认值设置为100.您还可以使用slabtop命令分析内存使用情况。在您的情况下,dentry和*_inode_cache值必须很高。
如果你想要一个绝对限制,你应该查找cgroups。将Ceph OSD服务器放在cgroup中,并通过为cgroup设置memory.limit_in_bytes参数来限制它可以使用的最大内存。
memory.memsw.limit_in_bytes设置内存和交换使用总和的最大金额。如果未指定单位,则将该值解释为字节。但是,可以使用后缀来表示更大的单位 – k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。
参考文献:
[1] – GlusterFS Linux内核调优
[2] – RHEL 6资源管理指南
作者:NOLFXceptMe
更多相关内容 -
服务器cache
2014-09-22 00:08:42Web相关Cache介绍 简介 Cache,中文意思是缓存,是用来将频繁访问的数据,存储于用户本地或者是访问速度很快的存储介质上,以便于提高访问...以下分别客户端cache、代理服务器、CDN及镜像站点、中心CACHE服务器、JWeb相关Cache介绍
简介
Cache,中文意思是缓存,是用来将频繁访问的数据,存储于用户本地或者是访问速度很快的存储介质上,以便于提高访问速度及响应时间,我们的电脑的C PU中也有调整缓存,不过我今天这里说的是WEB方面的CACHE,如何合理的使用WEB相关的CACHE,提交用户访问网站的速度及响应时间。以下分别客户端cache、代理服务器、CDN及镜像站点、中心CACHE服务器、JVM CACHE、数据库CACHE简单的介绍了每种CACHE,参考了很多的文章,在些对原作者表示感谢,本文无求育人,只求自育。
客户端CACHE
客户端CACHE,包括浏览器本身的缓存、FLASH存储等,用于存储一些临时的文件或者变化不太或无变化的数据:如浏览器自动将用户浏览的网页存储在用户的硬盘上,下次再浏览相同的网站的时候,系统会自动从硬盘中调出该网页,既节省了时间也减少了网络的交换;还有就是相同的数据需要以不同的形式在客户端展现,如新版工作平台中的应用,页面加载的时候已经加载完了全部应用,但用户看到的并且不是全部应用,用户在做频道切换或者是通过查看全部应用面板查看全部应用的时候,就不需要到后台再次获取数据了,直接从浏览器本身的缓存中获取进行渲染即可,这样也增加了用户的访问速度。
目前国内的网络访问速度还不是很好,合理的得用客户端的CACHE功能,减少网络的访问次数,这无疑会提升客户体验,给被访问的网站加分,并且不会有硬件的费用投入,算从理论上讲是一种“零”投入的策略。
代理服务器(Proxy Server)
代理服务器(Proxy Server),常用的就是“翻墙”,从去年开始因为ZF对GOOGLE的限制,而我辈又要始终追随GOOGLE,那最好的一个办法就是“翻墙”去GOOGLE了;还有就是需要访问的站点访问速度比较慢,可以通过代理服务器提高访问的速度,以下是一个原理图:
商用的代理服务器,通常都是有CACHE功能的,访问都比较稳定,且个人信息安全性也相对要高得多;但是普通的代理服务器就一定有CACHE功能了,访问的稳定性也不一定能够保证,最可怕的个人信息的安全性完全没有保障,因而在考虑使用代理服务器的时候要慎重,否则不要因小失大,那可就亏大了。
CDN、镜像站点
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。 (也就是一个服务器的内容,平均分部到多个服务器上,服务器智能识别,让用户获取离用户最近的服务器,提高速度。
以下是CDN原理图:
现阶段,国内流量比较大的网站,如阿里巴巴、淘宝、腾讯、新浪、网易等都有使用CDN技术,这给用户的感觉就是在任何地方访问都比较快。
镜像站点、CDN这二者之间有一点比较类似,都是通过增加服务结点来降低访问的拥挤度,并提高用户访问的速度。他们的差别是镜像服务本身是一个独立的服务器,内容完全来自于主服务器,通过定期到主服务器去更新内容而保持内容与主服务器基本一致,如华军软件园的实现就是很多的镜像站点,直接访问该镜像的请求都全部去了该镜像服务器,这就会出现不同的镜像站点会有不同的访问压力,也就是没有导流、负载均衡的作用,但如果镜像站点出现了问题,是没有被其它服务器代理的,就相当于你访问的其它网站出现问题一样:挂了;CDN其实也是代理,只是他比镜像服务更智能的代理,如果当前服务器访问量过大时,可以将流量导到其它的其它服务器,提升响应的时间,它的优势在于几乎涵盖国内所有线路,而在可靠性上,CDN 在结构上实现了多点的冗余,即使某一个节点由于意外发生故障,对网站的访问能够被自动导向其他的健康节点进行响应。CDN能轻松实现网站的全国铺设,不必考虑服务器的投入与托管、不必考虑新增带宽的成本、不必考虑多台服务器的镜像同步、不必考虑更多的管理维护技术人员。
中心数据CACHE服务器
以上谈到的都是应用以外的CACHE,以增加服务器节点提升用户访问速度,有没有办法使系统在获取数据数据时不是每次都和数据库打交道,减少I/O的开销,从而提访问速度呢?答案是肯定的,阿里使用的是内存CACHE(memcached),将经常访问、不易变化且CACHE命中率比较大的数据,放到CACHE服务器中,如阿里助手的菜单,这些数据都是不怎么变化,放到CACHE中应用在获取菜单数据时,速度就会提高,从而提高应用响应时间,也可以说是提高了用户的访问速度。
在选择,需要注意几点:1、CACHE的可靠性,在大量访问及使用的情况,能够保证数据的可靠性;水平伸缩性比较好,这方便于快速提高CACHE的系统容量;CACHE要能够快速数据恢复,当其中某台CACHE出现问题的时候,其它的CACHE能够在短时间之内代替它的工作;2、CACHE的有效性,要支持定期的数据失效策略,为其它需要使用CACHE的数据提供存储空间。
使用CACHE的时候,也需要注意CACHE的命中率要高,意思就是CACHE中要存放经常访问、不易变化的数据,这才能够体现CACHE的价值,如果将阿里每个用户的个人信息都放到CACHE中,这是没有意义的。
JVM CACHE
这里说的JVM CACHE,也是将数据放到内存中,算是另外一种内存CACHE,如我们在代码中写的静态对象,只是这种CACHE是没有过期策略的,除了绝对不变的数据以外,如配置文件及参数可以保存JVM中,不推荐使用JVM CACHE;阿里助手的菜单使用的是MEMCACHE,没有使用JVM CACHE,因为菜单有些时候也需要做变更的,这个时候要使变更立马的反映出来,可以通过手动清理MEMCACHE的方式,而JVM CACHE是不方便清理的,并且如果又是在集群环境中,完全清理的成本将是非常大的,而使用中心CACHE服务器,只需清理一次就完全清除了;如果菜单出不来或者数据不正确,那至少是A类故障,呵呵,老板又要找我喝酒了。
另外还有一些数据库中间件,如IBATIS、HIBERNATE等,也都支持数据缓存,支持数据自动过期策略,可以设定CACHE的数量,如下是IBATIS的CACHE配置实现:
<cacheModel id="USERINFO-CACHE" type="LRU" readOnly="true" serialize="true">
<!---数据自动过期时间->
<flushInterval minutes="10"/>
<!---保存的结果集的数量->
<property name="size" value="500" />
<!---数据过期的操作->
<flushOnExecute statement="MY_SQL_INSERT"/>
<!---数据过期的操作->
<flushOnExecute statement="MY_SQL_UPDATE"/>
</cacheModel>
<select id="..." parameterClass="..." resultMap="..." cacheModel="USERINFO-CACHE">
SQL HERE
</select>
这个对于缓解数据库的的压力也是会起到不少作用的,特别是在对相同的数据进行高峰访问的情况下,那效果是港港的。
数据库CACHE
数据库本身也是有CACHE的,这里我们就不继续究下去了,有兴趣的可以去研究研究。
结束语
本篇介绍CACHE,是从离用户最近到用户最远的顺序进行介绍的,让你可以一层层的去了解合适的优化策略,比较泛泛,没有什么深入的东西,都只是从表面上谈到了一些东西,具体的场景和使用,还需要根据具体情况而定。
-
Linux下内存buff/cache占用过多问题解决
2018-06-22 15:57:49在Linux下经常会遇到buff/cache内存占用过多问题,尤其是使用云主机的时候最严重,由于很多是虚拟内存,因此如果buff/cache占用过大的,free空闲内存就很少,影响使用;通常内存关系是:普通机器:total=used+free...在Linux下经常会遇到buff/cache内存占用过多问题,尤其是使用云主机的时候最严重,由于很多是虚拟内存,因此如果buff/cache占用过大的,free空闲内存就很少,影响使用;
通常内存关系是:
普通机器:total=used+free
虚拟机器:total=used+free+buff/cache
比如说用腾讯云主机,就是total=used+free+buff/cache,如下图所示:
这个时候可以看到buff/cache占用的内存非常大,
这个时候可以使用一下命令去清除一下cache内存
echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches
如下图所示:
可以看到通过三次清除,内存由738变成了94,
free内存增加了!
-
Linux的buff/cache占用内存过高解决方法
2022-03-28 10:40:31最近,公司的开发服务器总是偶尔有一些java服务莫名其妙的停掉。通过排查发现是内存不足,奇怪的是,内存只是用了一半,但是可用的却只有不到1G(峰值时估计更少)。下面是具体的内存使用信息: 可以看到,可用的...最近,公司的开发服务器总是偶尔有一些java服务莫名其妙的停掉。通过排查发现是内存不足,奇怪的是,内存只是用了一半,但是可用的却只有不到1G(峰值时估计更少)。下面是具体的内存使用信息:
可以看到,可用的内存只有888M,内存共有62G,罪魁祸首就是这个buff/cache占用了27G。
产生原因
Linux操作系统频繁存取文件会导致内存被用光,即便是程序结束后也不会被正常释放,这就会导致buffers和cached占用过高。
首先,简单了解一下buff/cache的介绍:total:是指计算机总物理内存;
used:已用的内存;
free:空余的内存;
total = used + free总内存;
shared:被多个进程共享的内存;
buffers:用于存放要输出到disk(块存储)的数据,在这里buff是指被OS buffer住的内存;
cached:存放从disk上读出的数据;buffer和cache是为了提高IO性能并由OS管理。
解决方法
Linux具有先进的缓存机制,会针对dentry、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作用来提高读写效率。但是在进行了大量文件操作之后,缓存会把内存资源基本用光,虽然文件读取效率提高了,但是物理内存会逐渐被吃光。
因为服务进行了频繁的文件读写操作,但是为什么操作系统不会主动回收呢,原来是因为drop_caches的默认参数设置的就是不释放的。
drop_caches的值可以是0-3之间的数字,代表不同的含义:0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存我们可以用下面的命令来释放缓存:
# sync
# echo 1 > /proc/sys/vm/drop_caches
# echo 2 > /proc/sys/vm/drop_caches
# echo 3 > /proc/sys/vm/drop_caches
# sync
执行完命令后,free -h 查看内存,发现可用内存已经达到27G,buff/cache也被释放。这样只是暂时解决问题,我们可以写一个脚本配合定时任务来定时检查清除缓存:
#!/bin/bash
Mem=$(free -m | awk 'NR==2' | awk '{print $4}')
if [ $Mem -gt 1024 ];
then
echo "Service memory capacity is normal!" > /dev/null
else
sync
echo "1" > /proc/sys/vm/drop_caches
echo "2" > /proc/sys/vm/drop_caches
echo "3" > /proc/sys/vm/drop_caches
sync
最后,只需将脚本加入定时任务,即可!
-
解决buff/cache内存占用过多的问题
2021-02-01 19:01:581. Linux服务器使用时间较长之后就会出现buff/cache内存占用过多的现象 如图: 2. 可以用如下命令去清除一下cache内存 echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /... -
高并发之——Guava Cache
2019-10-27 11:18:02最近需要用到缓存来存放临时数据,又不想采用Redis,Java自带的Map功能太少,发现Google的Guava提供的Cache模块功能很强大,于是选择使用它。 本地缓存 本地缓存作用就是提高系统的运行速度,是一种空间换时间的... -
L1 Cache、L2 Cache、L3 Cache说明
2022-01-11 09:45:20L1 Cache、L2 Cache、L3 Cache说明 -
[linux]Cache过高解决办法
2018-07-06 15:02:11在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态:这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大。这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正... -
我的世界服务器太卡怎么办 MC服务器优化攻略
2021-03-09 19:58:15我的世界很多玩家都有自己的服务器,但是很多玩家并不知道怎么优化和维护服务器,从而导致服务器很卡,今天小编为大家带来的是我的世界服务器优化攻略,还不知道怎么优化服务器的小伙伴不要错过哦。系统的选择(网页... -
top used大, 可能是buff/cache大
2019-01-06 15:38:01used实际是个比较关键的指标,而该指标却并没有反应出服务器实际占用情况: 原因 实际这是缓存原因导致,可以通过命令释放,即上图的cached部分 解决 执行以下命令: echo 0 >/proc/sys/vm/drop_caches... -
清理linux中buff/cache值过大
2019-04-28 16:35:59在云上跑了一个深度学习的东西,但是数据量实在太大,为了加速。 我就直接将数据集全部加载到内存中,毕竟对于GPU云服务器来说,内存和GPU比起来实在不算钱。。。 但是运行top指令发现,linux中的buff/cache占比... -
清理buff/cache,释放更多的cache,让free大一点
2019-12-06 16:16:32那么 buff/cache主要是来干嘛的呢? Linux具有先进的缓存机制,会针对会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读 写)和Page Cache(针对文件inode的读写)进行缓存操作用来... -
Linux内存之Cache
2020-12-09 17:22:11Cache容量小但速度快,内存速度较低但容量大,通过优化调度算法,可以让系统的性能大大改善,感觉就像是又有了主存储器的内存,又有了Cache的访问速度。 1.2、程序是如何运行的? 我们先思考一个问题:我们的程序是... -
Linux中buff/cache内存占用过高解决办法
2020-11-17 16:31:17这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大。这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少)。一般情况下,对此命令输出的... -
宋宝华:深入理解cache对写好代码至关重要
2021-07-08 00:29:28There are only two hard things in Computer Science: cache invalidation and naming things.-- P... -
Linux中Cache内存占用太高解决办法
2021-05-14 17:25:20在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态:html 这里的默认显示单位是kb,个人服务器是128G内存,因此数字显得比较大。这个命令几乎是每个使用过Linux的人必会的命令,但越是这样的命令,彷佛... -
SpringBoot整合Spring Cache,简化分布式缓存开发
2021-07-16 13:44:04这篇博文,我们介绍,SpringCache,以及SpringCache是如何来统一不同的缓存技术以高效便捷的方式接入到项目中,最后,深入讲解SpringCache是如何解决缓存击穿,缓存穿透,缓存雪崩的,还有哪些不足。 -
终于有人把域名和DNS服务器给写明白了
2020-05-10 16:39:17终于有人把域名和DNS服务器给写明白了 -
浏览器缓存(一):强缓存 MEMORY CACHE 和 DISK CACHE
2020-11-20 09:44:29关于memory cache 和disk cache 随便浏览一个网站: 首次打开,或者开启浏览器的 Disable Cache(浏览器的Network下, 与Preserve log同级别),在size 一栏会显示资源大小。 在关闭Disable Cache 的情况下,然后... -
计算机缓存Cache以及Cache Line详解
2019-12-16 20:32:54转载: 计算机缓存Cache以及Cache Line详解 - ...L1,L2,L3 Cache究竟在哪里? - 老狼的文章 - 知乎 https://zhuanlan.zhihu.com/p/31422201 Cache是怎么组织和工作的? - 老狼的文章 - 知乎 https://zhuanlan... -
如何实现支持大文件的高性能HTTP文件上传服务器
2018-11-02 09:38:26但笔者最近在做项目时遇到了一个大问题,项目需要上传视频文件,这些视频文件的尺寸一般大于2GB,用PHP开发时,将服务器端的上传尺寸设置得足够大,但用Chrome、FirFox等浏览器上传时,经常出现响应... -
nginx proxy_cache缓存详解
2021-05-28 16:34:55目录 1. 关于缓冲区指令 1.1 proxy_buffer_size 1.2 proxy_buffering 1.3 proxy_buffers 1.4 proxy_busy_buffers_size 1.5 proxy_max_temp_file... 2.1 proxy_cache_path 2.2 proxy_temp_path 2.3 proxy -
MySQL优化配置之query_cache_size
2017-12-28 17:27:41原理 MySQL查询缓存保存查询返回的完整...但是随着服务器功能的强大,查询缓存也可能成为整个服务器的资源竞争单点。 初步设置 默认这个开关是关闭的,就是禁止使用query_cache,查询是否使用语句如下: mysql> -
解决mySQL占用内存超大问题
2020-11-20 14:56:30如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8m),我的mysql主机有2gb内存,所以我把它改为 402649088(400mb)。 4)、back_log: 要求 mysql 能有的连接数量。当主要mysql线程在一个很短时间内... -
Minecraft服务器优化教程-搬运
2021-07-31 07:06:31参数的调整分别为server.properties(原版服务器就有),bukkit.yml(水桶服或者衍生版就有),spigot.yml(Spigot或者衍生版就有),paper.yml(PaperSpigot才有)。* 其中对性能有显著影响的前面为红色的星号,有中等程度... -
JetCache系列 -- Cache 的使用场景和其详细使用
2020-11-12 14:32:00我们引入了Cache 这个概念, Cache 在计算机芯片, 各级内存,硬盘,乃至于各种软件设计中都是非常常见的,Cache 使用的好,能够合理分层,我们能解决百分之八十以上的性能问题,由于目前大部分的 互联网服务应用都... -
缓存Cache详解
2018-02-11 13:05:21一个使用缓存Cache的站点会监听客户端向服务器端发出的请求,并保存服务器端的回应——比如HTML页面、图片等文件。接着,如果有另外一个使用相同URL发送请求,他能够使用之前已经保存下来的反馈文件,而不是再次向... -
HttpRuntime.Cache的用法
2019-03-26 13:40:12HttpRuntime Cache用法及参数解释 System.Web.HttpRuntime.Cache的方法: Add,Insert,Get,Remove 存Cache方法: HttpRuntime.Cache.Add( KeyName,//缓存名 KeyValue,//要缓存的对象 Dependencies,//... -
jetcache官网教程
2018-05-09 22:58:57jetcache简介JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于... -
mysql系统调优之thread_cache_size
2021-02-24 15:50:19Threads_created:创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值 2、优化参数thread_cache_size thread_...