在 Linux 中启用/禁用异步文件 io 的所有/大多数方法是什么?

在 Linux 中启用/禁用异步文件 io 的所有/大多数方法是什么?

长话短说,我有两台使用 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_partial0在生产虚拟机上。我希望在某些配置文件中找到一些简单的开关或类似的东西。:-)

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

答案1

我发现我的设置中存在差异:MySQL。停止设置fs.aio-nr0,重新启动为2661。据记录,可选择使用 AIO我们发现调优技巧也一样。

因此,AIO 很可能不是导致我出现扩展问题的原因,因为它已在内核中启用,并且fs.aio-max-nr足够高。我想这就是我的问题的一般答案,这两个设置都需要没问题,其他一切都取决于具体应用程序。无论它是否使用 AIO,很可能没有其他额外的全局/系统范围设置影响该决定。

相关内容