EN 联系我们加入我们
典型案例
您现在的位置:首页 > 典型案例
【案例分享】SUSE系统中Lvcreate 报错处理

一、故障描述


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

 

二、故障分析


1、 报错输出

 

1.jpg

2、 报错分析


2.png

通过图中报错可以看到是io_setup返回失败,并且创建io engine失败,由此可以通过分析io_setup系统调用具体用来干什么的。

通过查看io_setup的man page手册可以看到如下:

可以看到io_setup是用来创建一个异步I/O上下文的。

 

查看系统的异步IO上下文内核参数aio-nr和aio-max-nr的说明如下:


3.png


由aio-nr和aio-max-nr的解释可以看到aio-nr是io_setup系统调用中为所有当前活动的aio上下文指定的事件总数的运行总和。如果aio-nr达到aio-max-nr,那么io_setup将在EAGAIN中失败。

通过查阅io_setup的返回值对应关系如下:


4.png


可以看到,返回0为成功,对应ERRORS下方可以看到EAGAIN的返回提示为指定的nr_events超出了用户在/proc/sys/fs/aio-max-nr中定义的可用事件的限制,与aio-nr和aio-max-nr的解释符合用户的报错。

由此可以看出,原因应该是系统的aio-max-nr的值超过了限制导致无法执行lvcreate。


3、 查看系统配置


5.png


可以看到系统配置aio-max-nr的大小为65535,在SuSE操作系统上aio-max-nr的值默认为1048576,客户配置的65535严重低于系统默认配置导致无法创建lv。

 

 

三、故障处理


将aio-max-nr的值调整为1048576,调整方法如下:


6.png


四、经验总结


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,建议至少是系统的默认值。



如欲了解更多,请登录安图特官方网站:www.antute.com.cn

版权所有 安图特(北京)科技有限公司 备案号:京ICP备17074963号-1
技术支持:创世网络