酒馆内存溢出问题解决方法

Published 2025-09-21 00:00 2247 words 12 min read

清绝 avatar

清绝

泛性恋/INFP/东北人/女性人类/爱佐助/爱唱歌/剑网3/明日方舟/黎明杀机/仙剑奇侠传

清绝在干嘛?

实体状态监测仪

电脑状态

电脑正在呼呼大睡

手机状态

暂时远离小屏幕

This post is not yet available in English. Showing the original.
本文旨在解决 SillyTavern 因 Node.js 内存溢出导致的应用崩溃问题。核心方案是通过在启动配置中添加 `--max-old-space-size` 参数来提高内存上限,并为 Termux、Windows 和 Linux 等不同平台提供了详细的计算与配置步骤。

一、问题原因

当 SillyTavern 运行时,可能会遇到应用突然报错并在后台自动重启的情况。检查后台日志,会发现类似下面的错误信息:

- FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

这个错误的原因是,SillyTavern 运行时所需要的内存,超过了 Node.js 程序的默认内存上限,导致了 “JavaScript 堆内存溢出”

本文通过修改启动配置,将这个内存上限值调整到更适合设备的值,从而解决此问题。如果 没有 遇到这个报错,不建议进行任何修改。


二、解决方案

Termux (安卓)

第 1 步:计算内存上限值

首先,需要计算出一个合适的内存上限值,通常建议设置为 当前可用内存的 75%

  1. 打开 Termux 应用。如果正在运行一键脚本,先退出。
    如何退出脚本?

    如果使用的是我的一键脚本,按下 0 键再按回车即可。对于其他脚本,可以点击屏幕上的 CTRL 键,然后用英文输入法按下 c 键(相当于 CTRL + C)。

  2. Termux 中执行以下命令:
    free -m | awk 'NR==2{print int($7 * 0.75)}'
  3. 命令执行后会返回一个数字。 务必记下 这个数字,下一步会用到。

第 2 步:修改启动配置

  1. 使用 MT 管理器,打开 SillyTavern 根目录下的 start.sh 文件。

  2. 找到文件末尾的 node "server.js" "$@" 这一行。

  3. node"server.js" 之间,加入 --max-old-space-size=<数值>

    # 修改前
    - node "server.js" "$@"
    # 修改后 (将 2888 替换为上一步计算出的数字!)
    + node --max-old-space-size=2888 "server.js" "$@"
  4. 保存文件,然后重新启动 SillyTavern 即可。

第 3 步:检查配置是否生效

  1. 在酒馆运行的状态下,切换到 Termux。从屏幕左上边缘向右滑动(需要一点位置和技巧...),点击 NEW SESSION 打开一个新窗口。
  2. 执行以下命令:
    ps aux | grep node
  3. 如果在输出结果中,看到了包含了 --max-old-space-size 参数的进程信息,这说明 配置已成功生效

Windows

第 1 步:计算内存上限值

需要计算出当前可用物理内存的 75% 作为内存上限值。

  1. 打开 PowerShell。可以按 Win + R 键打开“运行”窗口,输入 powershell 并回车。
  2. PowerShell 窗口中执行以下命令:
    [int]((Get-CimInstance -ClassName Win32_OperatingSystem).FreePhysicalMemory / 1024 * 0.75)
  3. 命令执行后会返回一个数字。 务必记下 这个数字,下一步会用到。

第 2 步:修改启动配置

  1. 在 SillyTavern 根目录下,找到 Start.bat 文件,右键选择“编辑”

  2. 找到文件中的 node server.js %* 这一行。

  3. nodeserver.js 之间,加入 --max-old-space-size=<数值>

    @echo off
    
    # 修改前
    - node server.js %*
    # 修改后 (将 2888 替换为上一步计算出的数字!)
    + node --max-old-space-size=2888 server.js %*
    
    pause
  4. 保存文件。如果之前有正在运行的酒馆黑窗口,先关掉,然后重新双击 Start.bat 启动。

第 3 步:检查配置是否生效

  1. 打开 任务管理器 (快捷键 Ctrl+Shift+Esc),切换到 “详细信息” 选项卡。
  2. 在表头(如“名称”、“PID”等)上 右键,选择 “选择列”
  3. 在弹出的窗口中,勾选 “命令行” 并确定。
  4. 找到名为 node.exe 的进程,查看它的“命令行”列。如果其中包含了 --max-old-space-size 参数,就说明 配置已成功生效

Linux (Docker 部署)

如果是跟着 我的教程 部署的,那么部署方式就是 Docker 部署。 如果做完还是会报错,那么尝试尽量轻量化预设、聊天记录。

第 1 步:计算内存上限值

  • 方案 A:高内存服务器 (可用物理内存 > 4GB) 在 SSH 终端中执行:
free -m | awk 'NR==2{print int($7 * 0.75)}'
  • 方案 B:低内存服务器 (可用物理内存 < 4GB 且已配置 Swap) 在 SSH 终端中执行:
free -m | awk 'NR==2{mem_avail=$7} NR==3{swap_total=$2; if(swap_total < 100){print "错误:未检测到有效的 Swap 空间。先配置 Swap 或使用高内存服务器的计算方案。" > "/dev/stderr"; exit 1} else{print int((mem_avail + swap_total) * 0.75)}}'

如果此命令报错提示未检测到 Swap, 跳转文末的附录 进行配置。

命令执行后会返回一个数字, 务必记下 这个数字。

  • 执行成功 会返回一个数字,如下图所示:

    执行成功示例
    执行成功示例

  • 执行报错 则会提示没有 Swap,如下图所示:

    执行报错示例
    执行报错示例

第 2 步:修改容器配置

这里以 1Panel 面板为例,其他 Docker 管理工具操作类似。

  1. 进入 1Panel,在 容器 -> 编排 页面找到 SillyTavern 项目,点击 “编辑”

  2. environment 部分,新增一行 NODE_OPTIONS 配置。

    services:
      sillytavern:
        # ... 其他已有配置 ...
        environment:
          # 下面这一行是新增的行 (将 1888 替换为上一步计算出的数字!)
          - NODE_OPTIONS=--max-old-space-size=1888
          - NODE_ENV=production
          - FORCE_COLOR=1
        # ... 其他已有配置 ...
  3. 点击 确认,容器会自动重新部署。

第 3 步:检查配置是否生效

  1. 在 SSH 终端中执行以下命令(将 sillytavern 替换为容器名):
    docker exec sillytavern node -e 'console.log(v8.getHeapStatistics().heap_size_limit / 1024 / 1024 + " MB")'
  2. 如果配置成功,会看到一个比设置的数值 稍微大一点 的数字。这是因为 Node.js 引擎自带了一些固定开销,属于 正常现象

Linux (Git / 非 Docker 部署)

如果做完还是会报错,那么尝试尽量轻量化预设、聊天记录。

第 1 步:计算内存上限值

  • 方案 A:高内存服务器 (可用物理内存 > 4GB) 在 SSH 终端中执行:
free -m | awk 'NR==2{print int($7 * 0.75)}'
  • 方案 B:低内存服务器 (可用物理内存 < 4GB 且已配置 Swap) 在 SSH 终端中执行:
free -m | awk 'NR==2{mem_avail=$7} NR==3{swap_total=$2; if(swap_total < 100){print "错误:未检测到有效的 Swap 空间。先配置 Swap 或使用高内存服务器的计算方案。" > "/dev/stderr"; exit 1} else{print int((mem_avail + swap_total) * 0.75)}}'

如果此命令报错提示未检测到 Swap, 跳转文末的附录 进行配置。

命令执行后会返回一个数字, 务必记下 这个数字。

第 2 步:修改启动配置

  • 分支 1:使用进程守护部署

    如果是通过面板来启动酒馆的,直接修改面板中的启动命令,可以忽略 start.sh 文件

    1. 在面板中,找到 SillyTavern 的进程管理或应用管理页面。

    2. 定位到“启动命令”(Startup Command) 或类似的输入框。

    3. nodeserver.js 之间,加入 --max-old-space-size=<数值>

      修改前:

      node server.js

      修改后 (将 2888 替换为上一步计算出的数字!):

      node --max-old-space-size=2888 server.js
    4. 保存配置,然后通过面板重启应用。

  • 分支 2:使用 systemd 服务或手动执行 ./start.sh 脚本

    只有当通过 systemd 服务(该服务配置为执行 start.sh)或在命令行中手动执行 ./start.sh 来启动应用时,才需要修改此文件。

    1. 打开 SillyTavern 根目录下的 start.sh 文件。

    2. 找到文件末尾类似 node "server.js" "$@" 的一行。

    3. node"server.js" 之间,加入 --max-old-space-size=<数值>

      # 修改前
      - node "server.js" "$@"
      # 修改后 (将 2888 替换为上一步计算出的数字!)
      + node --max-old-space-size=2888 "server.js" "$@"
    4. 保存文件。如果使用 systemd,重启服务 (sudo systemctl restart your-service-name);如果手动运行,则重新执行脚本。

第 3 步:检查配置是否生效

  1. 在酒馆运行的状态下,执行以下命令:
    ps aux | grep node
  2. 如果在输出结果中,看到了包含了 --max-old-space-size 参数的进程信息,这说明 配置已成功生效

附录:为低内存 Linux 服务器配置 Swap

如果是完整跟着我的教程部署,并使用了我提供的一键脚本,那么 Swap 已经设置好,无需额外配置。

如果服务器内存较小,并且在计算内存时收到了“未检测到 Swap”的错误,可以先用下面的命令配置一个自己内存大小 1-2 倍的大小的 Swap 交换空间。

以配置一个 2G 大小的 swap 为例。此操作会占用 2GB 的硬盘空间作为虚拟内存。注意自己的硬盘空间是否充足!

将以下命令完整复制并粘贴到 SSH 终端中执行:

sudo fallocate -l 2G /swapfile \
&& sudo chmod 600 /swapfile \
&& sudo mkswap /swapfile \
&& sudo swapon /swapfile \
&& echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

配置完成后,可以执行 free -m 来确认 Swap 所在行的 total 值是否为 2047 左右。确认无误后,再回到相应系统的章节,重新执行第一步的计算命令即可。

投喂清绝

微信 / 支付宝

感谢阅读,如果内容对你有帮助,不如赞助我一份美味夜宵吧~

If you enjoyed this, leave a comment~

© 2025 - 2026 清绝 @qingjue
Powered by theme astro-koharu · Inspired by Shoka