异步 IO 事件上限是什么
fs.aio-max-nr 限制系统范围内 Linux 原生异步 IO(AIO)的事件数量上限,默认 65536。数据库这类需要并发提交大量异步读写请求的负载会按批次申请事件槽位,槽位用尽后新的请求提交失败,应用侧通常看到资源暂时不可用的错误。它约束的是内核 AIO 接口的事件总量,与线程阻塞式 IO 或异步 IO 运行时(如 io_uring)不是同一套机制。
基本信息
| 参数 | fs.aio-max-nr(默认 65536) |
|---|---|
| 当前占用 | cat /proc/sys/fs/aio-nr |
| 典型报错 | 提交异步 IO 时返回资源暂时不可用 |
| 配套视图 | /proc/sys/fs/aio-nr 为全局已使用的事件数 |
| 厂商参考 | 部分数据库安装文档给出 1048576 量级的推荐值 |
| 注意区分 | 原生 AIO 与 io_uring 属于不同接口 |
典型使用场景
- 数据库部署验收:按安装文档核对异步 IO 相关参数是否达标
- 排查读写请求失败:错误信息指向资源不足时,先确认是否事件槽位用尽
- 容量评估:按并发会话数与单会话事件需求估算总量
- 多实例部署:同一台机器跑多个数据库实例时,事件需求叠加
- 回归验证:调整前后观察已用事件数与失败计数变化
查看与调整
查看与调整
sysctl fs.aio-max-nr # 读上限
cat /proc/sys/fs/aio-nr # 当前已使用的事件数
sysctl -w fs.aio-max-nr=1048576 # 临时上调
dmesg -T | grep -i aio | tail # 相关内核记录
ulimit -a | grep -i 'pending signals' # 线程与信号限制也需一并核对落盘与回读
落盘与回读
# /etc/sysctl.d/99-aio.conf
fs.aio-max-nr = 1048576 # 面向数据库类负载放宽异步 IO 事件上限
# 回读命令:sysctl fs.aio-max-nr观察与判断
| 观察点 | 含义 | 正常与异常 |
|---|---|---|
| aio-nr | 当前已使用的异步 IO 事件数 | 接近上限时新的提交可能失败 |
| aio-max-nr | 系统级上限 | 按业务并发规模评估是否需要提升 |
| 应用报错 | 提交异步 IO 失败 | 结合 aio-nr 判断是容量不足还是申请异常 |
| 多实例叠加 | 同机多实例共同消耗事件槽位 | 需要按总和评估而不是单实例 |
提高上限只是放宽准入:如果应用存在异步 IO 申请后未释放的问题,事件数会继续累积直到再次触顶。这类情况应当先结合应用日志与已用事件数增长曲线定位泄漏,而不是一味抬高上限。
报错时先看当前占用:已用事件数远低于上限说明问题不在这个参数,方向应转向应用配置、线程限制或存储路径。方向判断错误会浪费大量排查时间。