← 戻る

ファイル記述子の上限を引き上げ

nofile を 65535 に引き上げ、file-max と接続バックログも広げます。高負荷なサービスはこの三か所で詰まりがちです。

root が必要

ワンライン実行

curl -fsSL https://www.moiu.cn/scripts/limits-tune.sh | bash

ソース

#!/usr/bin/env bash
# 提高文件描述符上限
#
# 把 nofile 软硬上限提到 65535,并调大内核级的 file-max 与连接队列 ——
# 高并发服务经常在这三处撞墙。
# ❗ nofile 要重新登录(或重启服务)才对当前会话生效。

set -e

# 需要 root:下面的系统级改动都直接执行,不再逐条 sudo
if [ "$(id -u)" -ne 0 ]; then
    echo '[!] 这个脚本需要 root 权限,请用 sudo 重新运行:'
    echo '    curl -fsSL 脚本地址 | sudo bash'
    echo '    或已经下载到本地:sudo bash 本文件'
    exit 1
fi

LIMITS=/etc/security/limits.d/99-xiaomo.conf
SYSCTL=/etc/sysctl.d/99-xiaomo-limits.conf

echo '====== 提高系统上限 ======'

cat > "$LIMITS" <<'LIMITS_EOF'
# 由 XiaoMo 脚本写入
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
LIMITS_EOF

cat > "$SYSCTL" <<'SYSCTL_EOF'
# 由 XiaoMo 脚本写入
fs.file-max = 1000000
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
SYSCTL_EOF

sysctl --system >/dev/null

echo '[*] 已写入:'
echo "    $LIMITS"
echo "    $SYSCTL"

echo ''
echo '====== 当前内核值 ======'
echo "  fs.file-max:$(cat /proc/sys/fs/file-max)"
echo "  somaxconn:$(cat /proc/sys/net/core/somaxconn)"
echo ''
echo '❗ nofile 要重新登录(或重启服务)才对当前会话生效。'

元ファイルをダウンロード