长话短说,我有两台使用 VirtualBox 托管虚拟机的相同服务器,两台服务器都托管一台虚拟机,每台虚拟机的设置方式几乎相同,只是一台用于生产,另一台用于内部测试和开发。重要的是服务器的硬件和操作系统是相同的,两台虚拟机使用相同的操作系统,运行的软件也基本相同,只是使用场景略有不同。问题是,在运行一段时间后,我在生产虚拟机上遇到了一些工作负载的严重性能问题,我无法在内部虚拟机上重现这些问题。
虚拟机中的所有软件总体上都运行良好,没有错误,只是某些工作负载能够对虚拟机施加如此高的负载/开销/任何其他因素,以至于虚拟机变得非常慢且无法使用。运行几个小时后,即使重新启动 ClamAV 守护程序也会触发问题。我也可以通过 Tomcat 上的一些特殊负载来触发它,并且所有情况都具有大量 CPU 和至少一些共同的 I/O。但只有在生产环境中,具有相同数量 CPU、RAM 等的测试虚拟机才能按预期工作。即使在生产环境中,问题也不会在重新启动后直接发生,似乎只在运行几个小时后才会发生。
我现在正在做的是比较sysctl -a
这两个系统,并检查哪些差异可能会导致我的性能问题。其中一个差异如下:
fs.aio-max-nr = 65536
fs.aio-nr = 0
对阵
fs.aio-max-nr = 65536
fs.aio-nr = 2661
第一个是生产 VM。我还有一些其他 VM 0
,但有些 VM 的版本也为非 0。由于生产 VM 和测试 VM 托管非常相似的软件,httpd、Tomcat7、Postgres 9.6、自定义 Perl 服务等,所以一个有0
,而另一个没有,这对我来说毫无意义。据我所知,0
这仅仅意味着没有人在生产 VM 中使用异步 I/O,但在测试 VM 中使用。由于使用的是相同的软件,因此这种情况不太可能发生。
所以我猜测由于某种原因存在一些配置差异,导致 prod-VM 中的软件认为它不能使用异步 I/O,这可能会在我的用例中大大降低性能。
虽然aio-max-nr
显然这不是问题,但是否有其他设置、包、库或任何可能影响软件认为异步 I/O 不可用的东西?
我发现的唯一问题是特定于软件的,而与我正在使用的软件无关,或者没有提到fs.aio-max-nr
可能的瓶颈,这显然不是我的情况。
在过去,至少在原则上检查异步 I/O 是否可用的方法似乎有效,但现在似乎不再如此,在我的任何系统上都找不到任何东西。
grep kio /proc/slabinfo
https://kbflow.wordpress.com/2013/02/25/check-if-async-io-is-enabled-in-centos/ https://www.systutorials.com/linux-kernels/125888/patch-aio-remove-kioctx-from-mm_struct-linux-2-6-15/
以下确实提供了两个系统上相同的一些数据和结果:
ls -l /sys/kernel/slab | grep kio
lrwxrwxrwx 1 root root 0 Apr 18 13:03 aio_kiocb -> :t-0000128
lrwxrwxrwx 1 root root 0 Apr 18 13:02 kioctx -> :t-0000640
https://community.oracle.com/message/14732908#14732908
不过,我不确定这些数据告诉我什么,有些数据在两个虚拟机上是相同的,有些则不同,尤其objects_partial
是0
在生产虚拟机上。我希望在某些配置文件中找到一些简单的开关或类似的东西。:-)
AIO 在内核本身中启用:
cat /boot/config-4.4.0-119-generic | grep AIO
CONFIG_AIO=y
CONFIG_COMEDI_AIO_AIO12_8=m
CONFIG_COMEDI_AIO_IIRO_16=m
CONFIG_DELL_WMI_AIO=m