【发布时间】:2018-04-10 01:18:49
【问题描述】:
在 Linux 中,您可以读取 /proc/sys/fs/aio-nr 的值,这将返回总数。在系统中所有活动的 aio 上下文中分配的事件数。最大值由/proc/sys/fs/aio-max-nr 控制。
有没有办法判断哪个进程负责分配这些 aio 上下文?
【问题讨论】:
标签: linux linux-kernel aio
在 Linux 中,您可以读取 /proc/sys/fs/aio-nr 的值,这将返回总数。在系统中所有活动的 aio 上下文中分配的事件数。最大值由/proc/sys/fs/aio-max-nr 控制。
有没有办法判断哪个进程负责分配这些 aio 上下文?
【问题讨论】:
标签: linux linux-kernel aio
没有简单的方法。至少,我从来没有发现过!但是,您可以使用systemtap 看到它们被消耗和释放。
https://blog.pythian.com/troubleshooting-ora-27090-async-io-errors/
尝试执行那篇文章中的完整脚本在我的 Centos 7 系统上产生了错误。但是,如果你只看它的第一部分,即记录分配的部分,它可能会给你足够的洞察力:
stap -ve '
global allocated, allocatedctx
probe syscall.io_setup {
allocatedctx[pid()] += maxevents; allocated[pid()]++;
printf("%d AIO events requested by PID %d (%s)\n",
maxevents, pid(), cmdline_str());
}
'
您需要协调一些事情,以便在您的工作负载开始之前 运行 systemtap。
安装systemtap,然后执行上面的命令。 (注意,我已经从链接的文章中稍微改变了这一点,删除了未使用的freed 符号。)几秒钟后,它将运行。然后,开始你的工作量。
Pass 1: parsed user script and 469 library scripts using 227564virt/43820res/6460shr/37524data kb, in 260usr/10sys/263real ms.
Pass 2: analyzed script: 5 probes, 14 functions, 101 embeds, 4 globals using 232632virt/51468res/11140shr/40492data kb, in 80usr/150sys/240real ms.
Missing separate debuginfos, use: debuginfo-install kernel-lt-4.4.70-1.el7.elrepo.x86_64
Pass 3: using cached /root/.systemtap/cache/55/stap_5528efa47c2ab60ad2da410ce58a86fc_66261.c
Pass 4: using cached /root/.systemtap/cache/55/stap_5528efa47c2ab60ad2da410ce58a86fc_66261.ko
Pass 5: starting run.
然后,一旦您的工作负载开始,您将看到记录的上下文请求:
128 AIO events requested by PID 28716 (/Users/blah/awesomeprog)
128 AIO events requested by PID 28716 (/Users/blah/awesomeprog)
所以,不像lsof那么简单,但我认为这就是我们所拥有的一切!
【讨论】: