目录标题
✅ 关键内存信息(非常充裕)
-
总内存:503 GiB
-
空闲可用内存:
MemFree: 152 GiBMemAvailable: 392 GiB
-
Swap:未启用(0B),但目前并不是必要的瓶颈
-
最大内存占用进程(MySQL)也只用了约 23 GiB
❗问题定位:MSSQL 初始化失败 = 不是宿主机内存问题,而是容器级别内存限制或 SQL Server 内部启动配置问题!
❓你执行的是:
/opt/mssql/bin/sqlservr -mSQLCMD
但是日志中明确说:
Cannot allocate memory
sh: can't fork
而你系统还有 392Gi 可用 => 容器中实际可用内存被限制!
✅ 排查建议(根据部署方式)
🔍 1. 如果你用 Docker 启动的 SQL Server 容器
请检查:
docker inspect <mssql_container> | grep -i memory
然后确认是否有如下配置:
--memory="2g" # ← 太小了!应至少给 4~8G+
建议更新为:
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Your_password123' \
--memory="8g" --cpus="4" \
-v /opt/mssql:/var/opt/mssql \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2019-latest
🔍 2. 如果你是在 Kubernetes 中运行的(Pod)
请检查 MSSQL Pod 的资源限制是否过小:
resources:
requests:
memory: "4Gi"
limits:
memory: "8Gi"
MSSQL 启动阶段容易内存爆峰,如果
limit太小(如 2Gi),会直接 OOM 而不是慢启动!
🔍 3. 如果你是手动裸机运行(非容器)
你运行的命令:
/opt/mssql/bin/sqlservr -mSQLCMD
该方式默认读取 /var/opt/mssql/mssql.conf 配置中的限制项(包括最大内存)。
请检查是否配置了类似以下限制:
[memory]
memorylimitmb = 2048 # ← 太小了!
建议注释掉或设置为更高值,例如:
[memory]
memorylimitmb = 8192
或者直接删除 mssql.conf 中 [memory] 限制让其自动调度。
✅ 额外建议:启用 Swap 以避免极限场景中 fork 失败
虽然现在系统内存充足,但为了保险起见,建议配置一块 swap(特别适合 SQL Server 的某些 PAL 分配失败问题):
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
🧩 总结
| 项目 | 状态与建议 |
|---|---|
| 宿主机内存 | ✅ 非常充足(392 Gi 可用) |
| Swap | ⚠️ 建议启用 4~8Gi |
| SQL Server 内存限制 | ❗可能配置太小,建议至少 4~8Gi |
| 容器部署(如有) | ❗检查 --memory 或 k8s limits |
| 启动方式 | SQL Server 手动启动,排查 mssql.conf 配置项 |
1812

被折叠的 条评论
为什么被折叠?



