📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

monitor.fs.refresh_interval 配置项用于控制文件系统信息(FsInfo)监控数据的缓存刷新间隔

此配置决定了 FsService 多久刷新一次文件系统信息,包括磁盘使用情况、IO 统计等数据。通过缓存机制减少频繁的文件系统查询。

配置项属性 #

  • 配置路径: monitor.fs.refresh_interval
  • 数据类型: TimeValue(时间值)
  • 默认值: 1s(1秒)
  • 最小值: 1s(1秒)
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 否(需要重启节点生效)

配置项详解 #

工作机制 #

FsInfo 缓存刷新机制

FsInfoCache (SingleObjectCache):
├── 刷新间隔: refresh_interval (默认 1s)
├── 缓存对象: FsInfo (磁盘使用、IO 统计等)
└── 刷新策略: scheduleWithFixedDelay


刷新流程:

上次刷新
    │
    ↓ 等待 refresh_interval
    │
    ↓
触发本次刷新
    │
    ├── 调用 fsProbe.stats()
    │   ├── 获取磁盘使用量
    │   ├── 获取磁盘可用空间
    │   ├── 获取 IO 统计信息
    │   └── 获取文件系统路径
    │
    ├── 更新缓存
    │
    └── 下次请求使用新缓存
    │
    ↓ 检查完成
    ↓
等待 refresh_interval
    │
    ↓ (循环)


示例 (refresh_interval = 1s):

00:00.000 ──→ 缓存刷新 1
00:00.100 ──→ 请求 FsInfo → 使用缓存 1 ✅
00:00.500 ──→ 请求 FsInfo → 使用缓存 1 ✅
00:01.000 ──→ 缓存刷新 2
00:01.100 ──→ 请求 FsInfo → 使用缓存 2 ✅
...

与 always_refresh 的关系 #

缓存强制刷新机制

monitor.fs.always_refresh = false (默认):
├── 使用 refresh_interval 缓存
├── 减少文件系统查询
└── 性能更好 ✅


monitor.fs.always_refresh = true:
├── 忽略 refresh_interval
├── 每次请求都重新查询
└── 实时性最高,但性能较低 ❌

FsInfo 包含的信息 #

FsInfo 监控数据

磁盘使用信息:
├── total: 总磁盘空间
├── available: 可用空间
├── used: 已用空间
└── uses_percent: 使用百分比


IO 统计信息:
├── disk_reads: 读操作次数
├── disk_writes: 写操作次数
├── disk_read_bytes: 读取字节数
└── disk_write_bytes: 写入字节数


路径信息:
├── path: 数据路径
├── mount: 挂载点
└── type: 文件系统类型

配置建议 #

生产环境(默认) #

monitor:
  fs:
    refresh_interval: 1s  # 默认值

建议: 保持默认值 1s。快速响应文件系统变化。

减少刷新频率 #

monitor:
  fs:
    refresh_interval: 5s  # 减少刷新

建议: 设置为 5-10s。稳定的文件系统,减少系统开销。

极低刷新频率 #

monitor:
  fs:
    refresh_interval: 30s  # 极低频率

建议: 设置为 30-60s。非常稳定的系统,最低开销。

实时监控 #

monitor:
  fs:
    refresh_interval: 1s
    always_refresh: true  # 强制实时

建议: 需要完全实时监控时使用。

代码示例 #

easysearch.yml 基础配置 #

monitor:
  fs:
    refresh_interval: 1s

标准生产配置 #

monitor:
  fs:
    refresh_interval: 1s

低开销配置 #

monitor:
  fs:
    refresh_interval: 10s

实时监控配置 #

monitor:
  fs:
    refresh_interval: 1s
    always_refresh: true

相关配置 #

配置项作用默认值
monitor.fs.refresh_intervalFsInfo 刷新间隔1s
monitor.fs.always_refresh是否强制每次刷新false
monitor.fs.health.refresh_interval健康检查间隔120s

性能影响分析 #

refresh_interval 设置优点缺点
1s(默认)快速响应较高系统调用
5s平衡响应和开销标准设置
10s低系统调用响应延迟
30s+最低系统调用延迟较大

系统调用对比 #

不同间隔的系统调用频率

refresh_interval = 1s:
├── 每分钟调用: 60 次 statfs()
├── 系统开销: 中等
└── 数据延迟: 最多 1 秒


refresh_interval = 5s:
├── 每分钟调用: 12 次 statfs()
├── 系统开销: 低
└── 数据延迟: 最多 5 秒


refresh_interval = 10s:
├── 每分钟调用: 6 次 statfs()
├── 系统开销: 很低
└── 数据延迟: 最多 10 秒


refresh_interval = 30s:
├── 每分钟调用: 2 次 statfs()
├── 系统开销: 极低
└── 数据延迟: 最多 30 秒

使用场景 #

推荐使用默认值的场景 #

  • 动态环境: 文件系统使用变化频繁
  • 快速响应: 需要快速检测磁盘空间变化
  • 标准监控: 标准的监控需求

推荐增加间隔的场景 #

  • 稳定环境: 文件系统使用稳定
  • 减少开销: 希望减少系统调用
  • 长期监控: 不需要秒级响应
  • 资源受限: 系统资源紧张

推荐使用 always_refresh 的场景 #

  • 关键应用: 磁盘空间非常关键
  • 实时性: 需要完全实时的数据
  • 监控工具: 配合外部监控工具使用

与健康检查的对比 #

两种刷新机制的区别

FsInfo 刷新 (monitor.fs.refresh_interval):
├── 默认: 1s
├── 作用: 刷新磁盘使用、IO 统计等数据
├── 频率: 高频刷新
├── 开销: 较低
└── 用途: 提供监控数据


健康检查 (monitor.fs.health.refresh_interval):
├── 默认: 120s
├── 作用: 实际创建/删除文件测试写入能力
├── 频率: 低频检查
├── 开销: 较高
└── 用途: 确保文件系统健康


两者配合:
├── FsInfo: 提供数据(高频)
└── Health: 确保健康(低频)

数据延迟分析 #

监控数据的延迟

refresh_interval = 1s (默认):
00:00.000 ──→ 磁盘使用 80%
00:00.500 ──→ 磁盘使用 85% (实际发生)
00:00.800 ──→ 查询 → 返回 80% (缓存)
00:01.000 ──→ 缓存刷新 → 获取到 85%
00:01.100 ──→ 查询 → 返回 85% ✅
延迟: 最多 1 秒


refresh_interval = 10s:
00:00.000 ──→ 磁盘使用 80%
00:00.500 ──→ 磁盘使用 85% (实际发生)
00:05.000 ──→ 查询 → 返回 80% (缓存)
00:10.000 ──→ 缓存刷新 → 获取到 85%
00:10.100 ──→ 查询 → 返回 85% ✅
延迟: 最多 10 秒

注意事项 #

  1. 默认值: 默认值为 1s,适合大多数场景。

  2. 需要重启: 修改此配置需要重启节点。

  3. 最小值: 最小值为 1s,不能设置更小。

  4. 缓存机制: 使用缓存减少系统调用。

  5. always_refresh: 设置后会忽略此配置。

  6. 与健康检查区分: 与健康检查是不同的机制。

  7. 系统调用: 刷新会调用 statfs() 等系统调用。

  8. 监控建议: 根据监控需求选择间隔。

  9. 测试验证: 配置变更后应验证监控效果。

  10. 稳定环境: 稳定环境可以适当增加间隔。

FsProbe 实现 #

文件系统探测接口

FsProbe 接口:
├── stats(): 获取 FsInfo
├── 跨平台实现
└── 返回统一数据格式


Linux 实现:
├── 读取 /proc/mounts
├── 调用 statfs() 系统调用
└── 读取 /proc/diskstats


Windows 实现:
├── 调用 GetDiskFreeSpaceEx()
└── 调用 GetDriveType()