Linux页面缓存会降低双CPU服务器上的IO(64GB内存)

前端之家收集整理的这篇文章主要介绍了Linux页面缓存会降低双CPU服务器上的IO(64GB内存)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的 linux页面缓存存在很大问题,这会降低IO的速度.例如,如果我使用dd复制lvm分区,linux会将数据缓存在缓冲区或缓存中(free -m).这不是问题,但在缓冲区达到特殊值后,复制过程停止并减慢到几mbs甚至kbs.我在写入磁盘或/ dev / null时做了很多测试,问题与源驱动器或目标无关.

详细地:

>有两个几乎相同的服务器.两者都使用相同的内核运行CentOS 6.5.它们具有相同的磁盘,相同的设置,相同的其他硬件,各方面都相同.唯一的区别是一个服务器有2个cpu和64GB内存,另一个服务器有1个cpu和32 GB内存.
>以下是以下复制过程的图像:http://i.stack.imgur.com/tYlym.jpg
>这里有meminfo的新版本. meminfo来自不同的运行,因此值不是标识,但它是完全相同的行为:http://i.stack.imgur.com/4SIJG.jpg
>使用dd或其他文件系统复制程序启动复制.
>缓冲区或缓存开始填充.一切都很好.
>缓冲区或缓存达到最大数量(在64GB ram服务器上的值为32GB或17GB;在32GB ram服务器上的所有可用内存)
>在64GB RAM服务器上,复制过程现在停止或限制为几mbs.在32GB ram服务器上一切都很好.
>在64GB ram服务器上,我可以通过使用“sync; echo 3> / proc / sys / vm / drop_caches”强制缓存来解决问题.但当然缓冲区立即开始再次增长,问题再次发生.

结论:

这个问题要么与第二个cpu有关,要么与内存总量有关.我有“感觉”问题,即每个cpu都有自己的32GB内存,并且复制过程只在cpu上运行.所以最后复制过程将缓冲区/缓存增加到接近32GB或其他cpu的未使用内存然后linux认为嘿还有内存所以让我们进一步增加缓冲区但是下面的硬件无法访问内存,或者某事像那样.

有人有想法或解决方案吗?当然我可以使用直接标志的dd,但这不解决问题,因为还有通过samba等外部访问.

EDIT1:

这里还有来自64GB ram服务器的/ proc / zoneinfo:
1. http://pastebin.com/uSnpQbeD(在dd开始之前)2.http://pastebin.com/18YVTfdb(当dd停止工作时)

EDIT2:

> VM设置:http://pastebin.com/U9E9KkFS
> / proc / sys / vm / zone_reclaim_mode位于32 GB ram服务器0和64 GB ram服务器1上.我从未触及此值.安装程序设置这些.我将其更改为0并重试测试.现在所有内存都用于缓冲区和缓存.所以它看起来很棒,就像其他服务器一样.但随后它立即开始以全速交换…我将交换设置为0.这有所帮助,但它仍然每秒交换几mb.它每隔一段时间就会增加缓冲区.所以它不交换缓冲区,它交换vms的内存以获得更多的内存来增加缓冲区……疯狂.但也许这是正常的!?

EDIT3:

/ proc / buddyinfo和numactl –hardware:
http://pastebin.com/0PmXxxin

最后结果

> / proc / sys / vm / zone_reclaim_mode肯定是技术上的方法,但是机器后的机器效果不好.例如:如果我复制一个磁盘linux,现在使用100%的free mem来缓冲(不像之前只有XGB然后停止).但是在最后一个免费mem被用来缓冲的时候,linux开始交换vm内存并增加缓冲区和缓存的总量.在我的系统中通常不需要交换,因此交换内存与某些虚拟机位于同一磁盘上.在结果中如果一个备份这些vms linux写入交换的同时我从磁盘读取备份.因此交换vms是不好的,但是甚至更糟的是linux破坏了我的备份读取速度…所以将/ proc / sys / vm / zone_reclaim_mode设置为0不解决完整的问题…目前我在一个屏幕一个脚本,每隔10秒同步并刷新一次缓存…不是很好,但对我来说效果更好.我在系统上没有网络服务器或普通文件服务器.我只运行vms,通过samba进行备份和存储备份.我不喜欢这个解决方案.

解决方法

您看到的行为是由于Linux在NUMA系统上分配内存的方式.

我假设(不知道)32GB系统是非numa,或者不足以让Linux关注.

如何处理numa的行为由/ proc / sys / vm / zone_reclaim_mode选项决定.默认情况下,linux将检测您是否正在使用numa系统并更改回收标志,如果它认为它会提供更好的性能.

内存被分成多个区域,在numa系统中,第一个cpu插槽有一个区域,第二个cpu插槽有一个区域.它们作为node0和node1出现.如果你是cat / proc / buddyinfo,你可以看到它们.

当区域回收模式设置为1时,从第一个cpu套接字的分配将导致在与该cpu关联的内存区域上进行回收,这是因为从本地numa节点回收性能方面更有效.从这个意义上来说,回收就是删除诸如清除缓存之类的页面,或者在该节点上交换内容.

将值设置为0会导致在区域填满时不会发生回收,而是分配到内存的外部numa区域.这是以另一个cpu的breif锁定为代价来获得对该存储区的独占访问.

But then it instantly start swaping! after a few secouns: Mem: 66004536k total,65733796k used,270740k free,34250384k buffers Swap: 10239992k total,1178820k used,9061172k free,91388k cached

交换行为和交换时间取决于几个因素,一个因素是页面被分配给应用程序的活动程度.如果它们不是非常活跃,它们将被交换为支持缓存中发生的繁忙工作.我假设您的VM中的页面不会经常被激活.

猜你在找的Linux相关文章