首页/系统/Linux 内核与性能调优速查/fs.aio-max-nr 异步 IO 事件上限
sysctl 内核参数72 条

fs.aio-max-nr 异步 IO 事件上限

系统级 Linux 原生 AIO 事件数量上限(默认 65536);数据库等使用异步 IO 的负载可能先行触顶。

异步 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 申请后未释放的问题,事件数会继续累积直到再次触顶。这类情况应当先结合应用日志与已用事件数增长曲线定位泄漏,而不是一味抬高上限。
报错时先看当前占用:已用事件数远低于上限说明问题不在这个参数,方向应转向应用配置、线程限制或存储路径。方向判断错误会浪费大量排查时间。

易错点

  • 把报错直接归因于该上限:先用已用事件数判断是否真的逼近上限
  • 多实例叠加被忽略:按单实例估算会导致总量不足
  • 上限调大后不排查申请行为:申请后不释放的问题会继续累积
  • 与 io_uring 混淆:两者是不同的内核接口,参数与限制互不通用
  • 不做基线记录:后续无法判断该值是否被镜像或编排配置覆盖

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/fs.rst
  • Oracle Database 安装文档(AIO 参数建议)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌