您如何确定哪个进程用完了 Linux aio 上下文容量?
How do you determine which process is using up Linux aio context capacity?
在Linux中可以看到/proc/sys/fs/aio-nr
的值和这个returns的总号。在系统中所有活动的 aio 上下文中分配的事件。最大值由/proc/sys/fs/aio-max-nr
控制。
有没有办法判断哪个进程负责分配这些 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
那么简单,但我认为这就是我们所拥有的!
在Linux中可以看到/proc/sys/fs/aio-nr
的值和这个returns的总号。在系统中所有活动的 aio 上下文中分配的事件。最大值由/proc/sys/fs/aio-max-nr
控制。
有没有办法判断哪个进程负责分配这些 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
那么简单,但我认为这就是我们所拥有的!