您现在的位置是: 网站首页> 精品案例 系统内存不足(out of memory),导致程序初始化失败、资源分配异常,进而引发一系列连锁错误(如连接中断)

系统内存不足(out of memory),导致程序初始化失败、资源分配异常,进而引发一系列连锁错误(如连接中断)

若谷 若谷 2025-10-22 328 人已围观 【演示URL:】

简介系统内存不足(out of memory),导致程序初始化失败、资源分配异常,进而引发一系列连锁错误(如连接中断)。问题剖析及解决方案(不同的Linux系统有差异,大家谨慎操作。)

错误解析

  1. library initialization failed - unable to allocate file descriptor table - out of memory 最关键的错误:程序在初始化时需要分配「文件描述符表」(用于管理打开的文件、网络连接等资源),但因系统内存耗尽(out of memory),分配失败,导致程序启动失败。
  2. Too many errors, abort 由于内存不足引发了大量底层错误,程序无法继续执行,最终终止。
  3. Socket error Event: 32 Error: 10053

    网络连接被强制关闭(通常是因为服务器端进程因内存不足崩溃,导致客户端连接中断)。


解决方法


出现 library initialization failed - unable to allocate file descriptor table - out of memory 错误,核心原因是系统可用的文件描述符不足(同时可能伴随内存紧张,但优先解决文件描述符限制问题)。以下是通过修改系统最大文件数配置并重启 Codes 服务的完整步骤:

一、修改系统级文件描述符限制(全局总限制)

系统级限制(fs.file-max)控制整个操作系统可同时打开的文件描述符总数,需确保其值大于用户级限制。

1. 编辑内核配置文件

# 用 vim 编辑系统内核配置(需 root 权限)
sudo vim /etc/sysctl.conf

2. 添加 / 修改系统级限制

在文件末尾添加以下内容(值建议设为 1048576,即 100 万级,足够大多数场景):
fs.file-max = 1048576
  • 含义:整个系统最多可同时打开 1048576 个文件描述符(文件、网络连接等资源)。

3. 使配置立即生效

sudo sysctl -p
  • 验证:执行 sysctl fs.file-max,输出应为 fs.file-max = 1048576,表示生效。

二、修改用户级文件描述符限制(针对运行 Codes 服务的用户)

用户级限制控制单个用户 / 进程可打开的文件描述符数,需设置软限制(警告阈值)和硬限制(绝对上限)。

1. 编辑用户限制配置文件

sudo vim /etc/security/limits.conf

2. 添加用户级限制

在文件末尾添加以下内容(* 表示所有用户,若 Codes 服务有特定运行用户,可替换为用户名,如 codes):
# 软限制:达到时警告,可临时超过(但不建议)
* soft nofile 65535
# 硬限制:绝对上限,不可超过(需小于系统级 fs.file-max)
* hard nofile 65535
  • 建议值:65535(6 万 +),足够支撑高并发服务;若 Codes 服务需要更高,可设为 1048575(小于系统级的 1048576)。

3. 使配置生效

用户级限制需重新登录用户重启系统才能生效(临时生效可执行 newgrp <用户名>,但推荐重启确保稳定)。
  • 验证:重新登录后,执行 ulimit -n,输出应为 65535,表示生效。

三、为容器单独设置文件描述符限制(关键)

Docker 容器默认可能继承宿主机的限制,但部分场景下需在 docker-compose.yml 中显式配置容器的文件描述符限制,避免容器内进程受限于默认低值:

1. 编辑 docker-compose.yml(你的文件路径:$CODES_HOME/docker-compose.yml

vim $CODES_HOME/docker-compose.yml

2. 在 codes_web_server 服务的配置中添加 ulimits 字段

services:
  codes_web_server:  # 找到该服务的配置
    # 其他配置(镜像、端口等)...
    ulimits:
      nofile:
        soft: 65535  # 容器内软限制
        hard: 65535  # 容器内硬限制
    # 若有内存限制,也需调整(见步骤三)
    mem_limit: 4g  # 根据宿主机内存调整(如宿主机8G内存,可设4-6G)
  mem_reservation: 2g  # 预留内存(可选)


上一篇:安装 Docker 和 Docker Compose 的步骤及问题解决

下一篇:没有下一篇了!

相关文章

  • 初始化容量大于2TB的Linux数据盘,开机自动挂载磁盘分区 初始化容量大于2TB的Linux数据盘,开机自动挂载磁盘分区 初始化容量大于2TB的Linux数据盘,开机自动挂载磁盘分区;介绍了初始化容量大于2TB的Linux数据盘(parted)的操作场景、前提条件、划分分区并挂载磁盘、设置开机自动挂载磁盘分区。 文章阅读
  • 安装 Docker 和 Docker Compose 的步骤及问题解决 安装 Docker 和 Docker Compose 的步骤及问题解决 安装 Docker 和 Docker Compose 的步骤及问题解决;Linux 是 Docker 最常用的环境,推荐使用官方仓库安装,确保版本最新且稳定。 文章阅读
  • Linux常用的shell命令汇总 Linux常用的shell命令汇总 Linux系统下常用的系统级命令,包括软硬件查看、修改命令,有CPU、内存、硬盘、网络、系统管理等命令。 文章阅读
  • Linux系统通过ssh访问另一台内网服务器 Linux系统通过ssh访问另一台内网服务器 Linux系统通过ssh访问另一台内网服务器 文章阅读
  • 初始化Linux数据盘(parted),开机自动挂载磁盘分区 初始化Linux数据盘(parted),开机自动挂载磁盘分区 MBR支持的磁盘最大容量为2 TB,GPT最大支持的磁盘容量为18 EB,因此当您初始化容量大于2 TB的磁盘时,分区形式请采用GPT。对于Linux操作系统而言,当磁盘分区形式选用GPT时,fdisk分区工具将无法使用,需要采用parted工具。 文章阅读
  • 初始化Linux数据盘(fdisk)并 设置开机自动挂载磁盘分区 初始化Linux数据盘(fdisk)并 设置开机自动挂载磁盘分区 初始化Linux数据盘(fdisk)并 设置开机自动挂载磁盘分区 文章阅读

站点信息

程序员(若谷)的博客 微信公众号

售前客服:

售前客服微信

微信

售前客服微信
售前客服微信

微信

售前客服微信

售后客服:

售后客服微信

微信

售后客服微信