一、故障描述
接到客户电话,告知一台SuSE Linux系统在使用lvcreate创建lv时提示io_setup failed,无法创建lv,进而导致用户的应用数据无法落盘,需进行排查解决。
二、故障分析
1、 报错输出
2、 报错分析
通过图中报错可以看到是io_setup返回失败,并且创建io engine失败,由此可以通过分析io_setup系统调用具体用来干什么的。
通过查看io_setup的man page手册可以看到如下:
可以看到io_setup是用来创建一个异步I/O上下文的。
查看系统的异步IO上下文内核参数aio-nr和aio-max-nr的说明如下:
由aio-nr和aio-max-nr的解释可以看到aio-nr是io_setup系统调用中为所有当前活动的aio上下文指定的事件总数的运行总和。如果aio-nr达到aio-max-nr,那么io_setup将在EAGAIN中失败。
通过查阅io_setup的返回值对应关系如下:
可以看到,返回0为成功,对应ERRORS下方可以看到EAGAIN的返回提示为指定的nr_events超出了用户在/proc/sys/fs/aio-max-nr中定义的可用事件的限制,与aio-nr和aio-max-nr的解释符合用户的报错。
由此可以看出,原因应该是系统的aio-max-nr的值超过了限制导致无法执行lvcreate。
3、 查看系统配置
可以看到系统配置aio-max-nr的大小为65535,在SuSE操作系统上aio-max-nr的值默认为1048576,客户配置的65535严重低于系统默认配置导致无法创建lv。
三、故障处理
将aio-max-nr的值调整为1048576,调整方法如下:
四、经验总结
1.aio-max-nr介绍
Linux aio是Linux下的异步读写模型。Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性。对于文件的读写,即使以O_NONBLOCK方式来打开一个文件,也会处于"阻塞"状态。因为文件时时刻刻处于可读状态。而从磁盘到内存所等待的时间是惊人的。为了充分使用把数据从磁盘复制到内存的时间,引入了aio模型。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。
proc 文件系统包含了两个虚拟文件,它们可以用来对异步 I/O 的性能进行优化:
/proc/sys/fs/aio-nr 文件提供了系统范围异步 I/O 请求现在的数目。
/proc/sys/fs/aio-max-nr 文件是所允许的并发请求的最大个数。
2.aio-max-nr值设置多少合适
在实际生产环境中,aio-max-nr的值具体设置多少合适还需要看应用的启动时所需 aio slot,例如MySQL 默认是启用 innodb_use_native_aio,使用异步 IO 操作,MySQL 启动时所需 aio slot 若超过系统当前 fs.aio-max-nr 设置,则无法启动报错,在SuSE中默认的值是1048576,建议至少是系统的默认值。
如欲了解更多,请登录合法买球平台官方网站:wh.uupt.net