Victorialogs首崩,原来它也不是那么强壮

2 阅读1分钟

panic: FATAL: cannot mmap "victoria-logs-data/partitions/20260114/datadb/188A6FDD6B358A3A/values.bin3": cannot mmap file with size 4096 bytes; already memory mapped files: 64860: cannot allocate memory; try increasing /proc/sys/vm/max_map_count or passing -fs.disableMmap command-line flag to the application

麻烦的是我这个VL跑在容器里,而且没有做进程守护(不过做了也没用)

VictoriaLogs 启动时直接把数据文件 mmap 到内存,Linux 默认对每个进程最多允许 65530 次映射(/proc/sys/vm/max_map_count)。
你的库里有 64 860 个文件已经 mmap 出去了,再要映射新的 values.bin3 时触顶,于是直接 panic。

解决办法(任选其一,推荐先 1 后 2):

  1. 临时提高系统级上限(重启后失效,先救急)

    sudo sysctl -w vm.max_map_count=262144
    
  2. 永久生效
    把下面一行写进 /etc/sysctl.conf/etc/sysctl.d/99-victorialogs.conf

    vm.max_map_count = 262144
    

    然后

    sudo sysctl -p
    
  3. 如果机器内存本身吃紧,不想再 mmap,可直接让 VictoriaLogs 退回到普通 read/write IO:
    在启动参数里加上

    -fs.disableMmap
    

    这会牺牲一点性能,但不再占用 map 槽位;上限问题随之消失。

  4. 极端场景(单库百万级小文件)
    -fs.disableMmap-retentionPeriod / -snapshotKeepTime 搭配使用,定期合并/删除旧分区,减少文件数。

改完 /proc/sys/vm/max_map_count 后无需重启系统,只重启 VictoriaLogs 即可。