使用缓存时磁盘I / O较高?


9

几天前,我注意到磁盘I / O等待和磁盘活动下降(这很棒)。然后我还注意到我的缓存已满(*)且碎片化。然后我刷新了缓存。此后,磁盘延迟和磁盘活动跃升到以前的水平(这很糟糕)。

IOtop显示[jbd2 / sda2-8]和[flush-8:00]始终位于磁盘使用率之上。这是具有大量可用内存(总共16 GB,其中约8 GB是缓冲区/缓存)的Dell R210,硬件RAID 1(H200)。

(*)缓存是PHP的APC操作码缓存,它减少了PHP脚本执行的磁盘访问。缓存已满并且分散,因为它包含来自开发实例的文件。当我注意到时,我将它们过滤掉了。

问题是:为什么磁盘I / O从理论上讲应该减少?以下是穆宁的一些图表。从2月6日到8日,缓存已满。

在此处输入图片说明 在此处输入图片说明 APC缓存目前还可以。

在我注释掉apc.mmap_file_mask后,按照@ cyberx86的说明进行更改

在此处输入图片说明 在此处输入图片说明

几天后https://serverfault.com/a/362152/88934


2
该图未显示IO的增加。
psusi 2012年

1
如果使用文件支持的内存映射(例如apc.mmap_file_mask=/tmp/apc.XXXXXX),则可能会看到I / O升高。尝试设置apc.mmap_file_mask为使用共享内存(例如/apc.shm.XXXXXX)或/dev/zero(共享的匿名映射内存)。
cyberx86

1
@psusi从2月6日中午12点到2月8日中午12点很低,然后增加了。
jcisio 2012年

@ cyberx86我刚刚更改了它(注释了该行以使用匿名mmapped内存),它看起来像是一个帮助。我将再监视几分钟以查看。谢谢。
jcisio 2012年

2
@psusi我只能继续回答多个问题,无法解释:1 / APC缓存未命中(但是这些PHP文件的OS缓存命中,所以磁盘I / O很少,等待时间更少,但平均I / O时间更多,其中大部分是MySQL InnoDB事务提交)2 / APC缓存命中,但APC正在使用文件(然后OS缓存未命中,不知道为什么)3 /简短,我的问题是“当缓存工作不正常时,(几乎)没有磁盘I / O”-您所说的完全相反。
jcisio 2012年

Answers:


10

如果使用文件支持的内存映射(例如apc.mmap_file_mask=/tmp/apc.XXXXXX),则可能会看到I / O升高。

尝试设置apc.mmap_file_mask为使用共享内存(例如/apc.shm.XXXXXX)或/dev/zero(共享的匿名映射内存)。保留设置为undefined会默认使用匿名映射内存。

通常,映射文件是一件好事:

  • 与完全将某些内容存储在内存中相比,映射文件通常需要更少的内存
  • 与将内容保存到文件相比,映射文件需要更少的磁盘I / O(因为写操作可以聚合在一起)。

但是,与仅将某些内容存储在内存中相比,它们确实会增加I / O-因此,当文件不断更改时,这样做的可能性很大。不使用映射文件的缺点是缺乏持久性-缓存将仅在内存中存储,因此重启后将无法生存。

因此,可能有人建议,当缓存正在填充和稳定时,它经历的变化最大,必须不断地将其写入磁盘。一旦高速缓存已满,则每个对象的ttl会降低高速缓存中数据的翻转速度,从而减少更改并减少磁盘写入。


4

几天后,现在我想返回一些图形。这种变化大大改善了这种情况。它减少了除IO服务时间以外的所有时间(我认为这是因为不再有琐碎的读取小型PHP文件的工作,而这是便宜的)。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

服务器负载(已经很低了,所以我没有发现更改)。

在此处输入图片说明


您能否提供所做的更改?
Mircea Vutcovici 2012年

阅读问题评论和接受的答案。我评论了apc.mmap_file_mask=/tmp/apc.XXXXXX
jcisio 2012年

嘿,抱歉打扰您了。您是否有任何注释掉mmap_file_mask行的副作用?我看到了同样的问题……这显然解决了我的I / O使用问题。但是我想知道……是否还有其他东西会破裂!谢谢!
Jorge Leandro Perez

我在注释该行时没有任何问题。
jcisio 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.