最近帮忙维护的一台镜像服务器出现了点问题,上面跑的varnish无规律地出现重启,导致缓存的内容全部被删除。出错log一般是这样的:
Mar 30 09:14:07 Cache-Node1 varnishd[15295]: Child (15297) not responding to CLI, killing it.
Mar 30 09:14:25 Cache-Node1 last message repeated 3 times
Mar 30 09:14:25 Cache-Node1 varnishd[15295]: Child (15297) died signal=3
Mar 30 09:14:25 Cache-Node1 varnishd[15295]: child (16153) Started
Mar 30 09:14:28 Cache-Node1 varnishd[15295]: Child (16153) said Child starts
Mar 30 09:14:28 Cache-Node1 varnishd[15295]: Child (16153) said SMF.s0 mmap'ed 2147483648 bytes of 2147483648而此时iostat反应的%iowait也非常高,数值达到了80+,%idle仅剩下10不到。
varnish如果运行在磁盘IO非常繁忙的服务器上,整体效能将会非常糟糕。也没有太好的办法去解决这一问题,只能做一些外围的优化。优化主要是两个方面,一个是调整varnish的cli_timeout值,我将其调整为cli_timeout = 60;另一方面需要调整系统sysctl优化vm内核,调整脏页写回到磁盘的值,我设定的值是:
vm.max_map_count = 65536
vm.swappiness = 60
vm.dirty_ratio = 60
vm.dirty_writeback_centisecs = 200
vm.dirty_background_ratio = 60
vm.dirty_expire_centisecs = 5000还有一条适用于CentOS 5,禁止刷新mmap页,但这个选项同样存在风险,慎用。另外 CentOS 6系列没有该项调整。
vm.flush_mmap_pages = 0最后一条:强烈建议varnish运行在CentOS 5.x 64bit,磁盘IO不是很繁忙的环境中。
附一份 Varnish 指南pdf,下载地址:http://dl.icodex.org/Varnish-guide-V1.0.pdf
