我在管理的几个 Linux 系统上遇到了一些 I/O 问题。它们表现在进程经常在诸如 open()、unlink() 或 close() 之类的简单系统调用中阻塞长达几秒钟的文件(这是一个问题,因为一些涉及的程序需要相当低的 I/O 延迟才能运行适当地)。确实,有问题的系统会遇到一些中等的 I/O 负载,但我很难认为这足以证明如此巨大的延迟时间是合理的。有时,调用可能需要 15 秒以上才能完成(尽管更多情况下可能需要 1、2 或 3 秒左右)。
我的问题是:我怎样才能找出发生这种情况的原因?我想要的是一些工具,它可以告诉我有问题的进程在内核中被什么阻塞,为什么它们休眠的进程很忙,它发生了什么,等等。是否有这样的工具,或者是否有其他尝试调试发生的事情的方法?
另外,当然,如果您有任何线索,其实什么是发生的事情,怎么能避免?
作为记录,我使用的文件系统是 XFS。
我已经有几年没有编译过 Linux 内核了,现在我又开始这样做了,我发现模块默认安装有调试符号,除非INSTALL_MOD_STRIP=1
传递给make modules_install
,这使得它们如此庞大,以至于我的 initrd 映像增长到了数百个兆字节。
我只是在谷歌INSTALL_MOD_STRIP
搜索了相当多的时间后才找到了这个选项,即使这样,也只是在论坛帖子中,人们问为什么他们的模块如此大。
所以我想知道,当我使用预编译内核时,这种变化的原因是什么?是否有一个原因是模块现在默认安装有调试符号(即使二进制发行版仍然将它们剥离)?在内核中使用调试符号似乎相当深奥,而且在安装大小方面显然有很大的缺点。
基本上,我应该只考虑INSTALL_MOD_STRIP
作为标准内核编译公式的一部分吗?从 ~2.6.25 开始,构建过程还有其他我应该注意的变化吗?
我正在尝试在 6RD 配置(在 Linux 上)上进行设置radvd
,其中我有一个 /64 子网,并且我正在尝试在两个不同的物理网络上使用它,所以我尝试给每个网络一个 / 80 子网。然而,当我开始radvd
使用这些界面时,它会这样说:
radvd[3987]: prefix length should be 64 for int
Run Code Online (Sandbox Code Playgroud)
(int
是接口之一的名称。)
我知道无状态自动配置不适用于大于 /64 的子网,例如 /48 子网,但据我所知,它应该适用于小于 /64 的任何子网,因此 /80 应该不是问题。现在,最终的效果是radvd
简单地通告错误的子网前缀,从而有效地“删除”它的前 16 位。
这是什么?我是否都错了,有radvd
问题,还是我缺少一些配置选项?