长话短说,我有两台相同的服务器使用 VirtualBox 托管虚拟机,两台服务器都托管一个虚拟机,每个虚拟机的设置方式几乎相同,只有一个用于生产,另一个用于内部测试和开发。重要的是服务器的硬件和操作系统是相同的,两个虚拟机都使用相同的操作系统,运行的软件也基本相同,只是使用场景有点不同。问题是,在运行一段时间后,我在生产虚拟机上遇到了一些工作负载的大量性能问题,我无法为内部虚拟机重现这些问题。
VM 中的所有软件通常都“正常”工作,没有错误,只是某些工作负载能够在 VM 上施加如此高的负载/开销/任何东西,以至于它变得非常缓慢且无法使用。经过几个小时的运行后,即使重新启动 ClamAV 守护程序也已经触发了问题。我也可以通过 Tomcat 上的一些特殊负载来触发它,并且所有情况都有大量 CPU 和至少一些共同的 I/O。但只有在 prod 中,具有相同数量的 CPU、RAM 等的测试 VM 才能按预期工作。即使在 prod-VM 中,问题也不会在重新启动后直接出现,似乎只是在运行几个小时后才会出现。
我现在正在做的是比较sysctl -a
两个系统并检查哪些差异可能导致我的性能问题。一个区别如下:
fs.aio-max-nr = 65536
fs.aio-nr = 0
对比
fs.aio-max-nr = 65536
fs.aio-nr = 2661
第一个是生产虚拟机。我也有其他一些虚拟机0
,但也有一些非 0。0
因为 prod- 和 test-VM 托管非常相似的软件,httpd、Tomcat7、Postgres 9.6、自定义 Perl 服务等,所以对我来说,一个拥有而另一个没有,对我来说没有任何意义。从我所读到的,0
仅仅意味着没有人在 prod-VM 中使用异步 I/O,而是在 test-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
不过,不确定这些数据告诉我什么,一些数据在两个 VM 上是相等的,有些是不同的,尤其objects_partial
是0
在 prod-VM 上。我希望在一些配置文件中找到一些简单的开关或类似的东西。:-)
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
我在我的设置中发现了不同之处:MySQL。停止设置
fs.aio-nr
为0
,2661
重新开始。它被记录为可选地使用 AIO,并且还可以找到调整技巧。所以,AIO 很可能不是我的扩展问题的原因,因为它在内核中启用并且
fs.aio-max-nr
足够高。我想这是我问题的一般答案,这两个设置都需要确定,其他一切都取决于具体的应用程序。无论是否使用 AIO,很可能没有其他额外的全局/系统范围设置影响该决定。