【案例分享】Suse系统中Lvcreate 报错处理

故障描述
接到客户电话,告知一台SuSE Linux系统在使用lvcreate创建lv时提示io_setup failed,无法创建lv,进而导致用户的应用数据无法落盘,需进行排查解决。
故障分析
01报错输出

通过图中报错可以看到io_setup返回失败,且创建io engine失败,由此可以进一步分析io_setup系统调用的具体作用。
02报错分析
通过查看io_setup的man page手册可以看到如下:

可以看到io_setup是用来创建一个异步I/O上下文的。
查看系统的异步I/O上下文内核参数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。
03查看系统配置

我们查看了系统配置后发现aio-max-nr的大小为65535,而在SuSE操作系统上aio-max-nr的值默认为1048576;客户配置的65535严重低于系统默认配置导致无法创建lv。
故障处理
将aio-max-nr的值调整为1048576,调整方法如下:

调整后则可以创建lv。
经验总结
01. 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 文件是所允许的并发请求的最大个数。
02. aio-max-nr值设置多少合适
在实际生产环境中,aio-max-nr的值具体设置多少合适还需要看应用启动时所需的aio slot,例如MySQL默认是启用innodb_use_native_aio,使用异步 I/O 操作,如果MySQL启动时所需的 aio slot 超过系统当前fs.aio-max-nr设置,则无法启动报错,因为在SuSE中默认的值是1048576,建议至少设置为系统的默认值。