什么是 XanMod 内核
默认的 Linux 内核被设计为一种通用解决方案,能够在不同的系统和硬件配置上提供广泛的兼容性。它稳定、可靠且经过广泛测试,但并不总是针对特定用例提供最佳性能。
自定义内核(例如 XanMod)则能满足这一需求。XanMod 内核是基于最新稳定版本的 Linux 内核,旨在通过低延迟提高系统的响应性能。它是由社区驱动的项目,结合了其他内核的最佳特性和独特的增强功能,更加专注于优化桌面、多媒体和游戏工作负载,以提供更具响应性和流畅性的 Linux 使用体验。
对于较旧的 Linux 发行版来说,切换到像 XanMod 这样的自定义内核可以提供显著的性能改进。但需要注意的是,使用自定义内核需要更多的技术知识,而且可能不像默认 Linux 内核那样稳定。
XanMod 内核的特点
XanMod 旨在增强 Linux 的使用体验,以下是 XanMod 官方网站上列出的一些主要特点:
- 核心和进程调度、负载均衡、缓存、虚拟内存管理器和 CPUFreq 调节器的优化:这些优化旨在提升 Linux 系统的性能,确保系统资源被高效利用,让使用体验更加流畅和响应迅速。
- 针对高 I/O 吞吐量的完整多核块层运行队列请求:该功能旨在提高 Linux 系统在处理大量 I/O 操作时的性能,确保系统可以处理大量数据而不会变慢。
- 可用的实时 Linux 内核(PREEMPT_RT)构建:该功能专为关键运行时应用程序设计,如 Linux 游戏服务器/客户端、电子竞技、流媒体、直播制作和超低延需求迟用户。确保系统可以在无延迟的情况下处理实时任务。
- 可用的第三方补丁集:包括来自各种来源的补丁,为内核提供额外的功能和改进。这些补丁可以进一步提升系统的性能和功能。
- AMD Zen 处理器的 P-state CPPC 驱动程序:该驱动程序旨在提升 AMD 处理器的性能,确保 AMD 处理器能够发挥最佳性能。
- Intel 处理器的 SMT 任务迁移调度程序重构:该功能旨在提高 Intel 处理器的性能,确保 Intel 处理器能够发挥最佳性能。
- 针对 Wine 和 Proton 的 Futex waitv 和传统的 WAIT_MULTIPLE 实现以支持 Fsync:此功能旨在提升 Wine 和 Proton 的性能,这两款应用程序可以在 Linux 上运行 Windows 应用程序。确保 Windows 应用程序在 Linux 系统上顺畅运行。
- Cloudflare 的 TCP 折叠处理以实现高吞吐量和低延迟:此功能旨在提升网络性能,确保系统可以处理大量的网络流量而不会变慢。
- Google 的多代 LRU 框架:此功能旨在改善内存管理,确保系统可以处理大量的内存而不会变慢。
- Google 的 BBRv2 TCP 拥塞控制:此功能旨在提升网络性能,确保系统可以处理大量的网络流量而不会变慢。
- Netfilter nf_tables RFC3489 全锥形 NAT 支持:此功能旨在提升网络性能,确保系统可以处理大量的网络流量而不会变慢。
- Netfilter FLOWOFFLOAD 目标以加速数据包处理:此功能旨在提升网络性能,确保系统可以处理大量的网络流量而不会变慢。
- 用于 Wine 快速内核支持的 WineSync 驱动程序:此功能旨在提升 Wine 的性能,用于在 Linux 上运行 Windows 应用程序。确保 Windows 应用程序在 Linux 系统上顺畅运行。
- PCIe ACS Override 用于绕过 IOMMU 组支持:此功能旨在提升 PCIe 设备的性能,确保 PCIe 设备能够发挥最佳性能。
- Graysky 的额外 GCC 和 Clang CPU 选项:这些选项旨在提升 Linux 系统的性能,确保系统能够发挥最佳性能。
- Clear Linux 补丁集:包括来自 Clear Linux 项目的补丁,为内核提供额外的功能和改进。这些补丁可以进一步提升系统的性能和功能。
- 适用于 Anbox 的 Android Binder IPC 驱动程序:该驱动程序旨在提升 Anbox 的性能,Anbox 用于在 Linux 上运行 Android 应用程序。确保 Android 应用程序在 Linux 系统上顺畅运行。
XanMod 内核选择
XanMod 项目提供多种不同的内核构建,每种构建都针对特定的用例和硬件配置。
XanMod MAIN 内核
MAIN 内核是标准的 XanMod,包括最新稳定版本的 Linux 内核,并针对桌面、多媒体和游戏工作负载进行了优化。MAIN 内核有四个版本可供选择:
- linux-xanmod-x64v1
- linux-xanmod-x64v2
- linux-xanmod-x64v3
- linux-xanmod-x64v4
XanMod EDGE 内核
EDGE 内核专为想要最新功能和增强的用户而设计,它们包括最近版本的 Linux 内核,并针对高性能工作负载进行了优化。EDGE 内核有三个版本可供选择:
- linux-xanmod-edge-x64v2
- linux-xanmod-edge-x64v3
- linux-xanmod-edge-x64v4
XanMod LTS 内核
LTS(长期支持)内核是为将稳定性和可靠性放在优先考虑的用户而设计,它们包括较旧但经过更多测试的 Linux 内核版本,并针对通用工作负载进行了优化。LTS 内核有四个版本可供选择:
-
- linux-xanmod-lts-x64v1
- linux-xanmod-lts-x64v2
- linux-xanmod-lts-x64v3
- linux-xanmod-lts-x64v4
XanMod RT 内核
RT(实时)内核是为关键应用场景设计的,例如 Linux 游戏服务器、流媒体、直播制作和超低延迟需求的用户,它们包括 PREEMPT_RT 实时补丁,可降低系统的延迟并提高响应性。RT 内核有三个版本可供选择:
- linux-xanmod-rt-x64v2
- linux-xanmod-rt-x64v3
- linux-xanmod-rt-x64v4
这些特定的 XanMod 内核构建被设计用于特定的硬件配置,涵盖从较旧的 x86-64 系统到最新的 AMD 和 Intel 处理器。您可以在 XanMod 网站上找到不同内核构建硬件兼容性的更详细信息。
安装前的准备
更新系统
sudo apt update && sudo apt upgrade
添加并注册 APT 存储库
sudo apt install gnupg echo 'deb http://deb.xanmod.org releases main' | sudo tee /etc/apt/sources.list.d/xanmod-kernel.list wget -qO - https://dl.xanmod.org/gpg.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/xanmod-kernel.gpg add -
更新 apt 软件包索引
sudo apt update
安装 XanMod
检查CPU支持内核版本
注意:一定要选择符合的版本进行安装,否则将导致无法正常启动!
awk -f <(wget -O - https://dl.xanmod.org/check_x86-64_psabi.sh)
根据输出的内容,你可以清楚地看到v2、v3或v4的标识,据此选择对应的 XanMod 内核
安装内核
以下命令以 XanMod EDGE x64 v3 内核的安装为例,你可以根据自己的需求修改命令
sudo apt install linux-xanmod-edge-x64v3
查看所有内核
dpkg --list | egrep -i --color 'linux-image|linux-headers'
如果安装成功,你就可以看到 XanMod EDGE x64 v3 内核
删除不需要的内核和配置文件
内核已经安装成功,但是当前并未生效,所以你需要将其他内核删除。当然,你也可以不删除,指定启动内核即可。关于此请自行搜索教程。
删除内核(请根据上面命令中输出结果,修改下面的命令) sudo apt remove linux-image-5.10.0-26-amd64 删除内核配置文件(请根据上面命令中输出结果,修改下面的命令) sudo apt purge linux-image-amd64 查看到的所有内核列表中: 前面标记ii的,即为内核。其中linux-headers为当前使用的启动内核,linux-image为当前系统中安装的内核;前面标记rc的,为已被删除的内核所留存的配置文件。
更新系统软件包并清除未使用的依赖项
sudo apt-get update sudo apt-get autoremove
更新 GRUB 配置
sudo update-grub
验证安装
cat /proc/version
重启系统
reboot
查看正在使用的内核
uname -mrs
查看BBR3状态
modinfo tcp_bbr
如果提示:modinfo: ERROR: Module tcp_bbr not found.错误请执行sudo depmod命令再查看BBR3状态。
现在 XanMod 内核已经安装成功并生效。
XanMod 内核优化设置
以下是本人使用的XanMod 内核优化设置,你可以无脑替换/etc/sysctl.conf文件中的所有内容,也可以根据自己的实际情况进行优化。
# ------ 网络调优: 基本 ------ # TTL 配置, Linux 默认 64 # net.ipv4.ip_default_ttl=64 # 参阅 RFC 1323. 应当启用. net.ipv4.tcp_timestamps=1 # ------ END 网络调优: 基本 ------ # ------ 网络调优: 内核 Backlog 队列和缓存相关 ------ # Ref: https://www.starduster.me/2020/03/02/linux-network-tuning-kernel-parameter/ # Ref: https://blog.cloudflare.com/optimizing-tcp-for-high-throughput-and-low-latency/ # Ref: https://zhuanlan.zhihu.com/p/149372947 # 有条件建议依据实测结果调整相关数值 # 缓冲区相关配置均和内存相关 net.core.wmem_default=16384 net.core.rmem_default=262144 net.core.rmem_max=536870912 net.core.wmem_max=536870912 net.ipv4.tcp_rmem=8192 262144 536870912 net.ipv4.tcp_wmem=4096 16384 536870912 net.ipv4.tcp_adv_win_scale=-2 net.ipv4.tcp_collapse_max_bytes=6291456 net.ipv4.tcp_notsent_lowat=131072 net.core.netdev_max_backlog=10240 net.ipv4.tcp_max_syn_backlog=10240 net.core.somaxconn=8192 net.ipv4.tcp_abort_on_overflow=1 # 流控和拥塞控制相关调优 # Egress traffic control 相关. 可选 fq, cake # 实测二者区别不大, 保持默认 fq 即可 net.core.default_qdisc=fq_pie # Xanmod 内核 6.X 版本目前默认使用 bbr3, 无需设置 # 实测比 bbr, bbr2 均有提升 # 不过网络条件不同会影响. 有需求请实测. # net.ipv4.tcp_congestion_control=bbr3 # 显式拥塞通知 # 已被发现在高度拥塞的网络上是有害的. # net.ipv4.tcp_ecn=1 # TCP 自动窗口 # 要支持超过 64KB 的 TCP 窗口必须启用 net.ipv4.tcp_window_scaling=1 # 开启后, TCP 拥塞窗口会在一个 RTO 时间 # 空闲之后重置为初始拥塞窗口 (CWND) 大小. # 大部分情况下, 尤其是大流量长连接, 设置为 0. # 对于网络情况时刻在相对剧烈变化的场景, 设置为 1. net.ipv4.tcp_slow_start_after_idle=0 # nf_conntrack 调优 # Add Ref: https://gist.github.com/lixingcong/0e13b4123d29a465e364e230b2e45f60 net.nf_conntrack_max=1000000 net.netfilter.nf_conntrack_max=1000000 net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30 net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 net.netfilter.nf_conntrack_tcp_timeout_close_wait=15 net.netfilter.nf_conntrack_tcp_timeout_established=300 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=7200 # TIME-WAIT 状态调优 # Ref: http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html # Ref: https://www.cnblogs.com/lulu/p/4149312.html # 4.12 内核中此参数已经永久废弃, 不用纠结是否需要开启 # net.ipv4.tcp_tw_recycle=0 ## 只对客户端生效, 服务器连接上游时也认为是客户端 net.ipv4.tcp_tw_reuse=1 # 系统同时保持TIME_WAIT套接字的最大数量 # 如果超过这个数字 TIME_WAIT 套接字将立刻被清除 net.ipv4.tcp_max_tw_buckets=55000 # ------ END 网络调优: 内核 Backlog 队列和缓存相关 ------ # ------ 网络调优: 其他 ------ # Ref: https://zhuanlan.zhihu.com/p/149372947 # Ref: https://www.starduster.me/2020/03/02/linux-network-tuning-kernel-parameter/#netipv4tcp_max_syn_backlog_netipv4tcp_syncookies # 启用选择应答 # 对于广域网通信应当启用 net.ipv4.tcp_sack=1 # 启用转发应答 # 对于广域网通信应当启用 net.ipv4.tcp_fack=1 # TCP SYN 连接超时重传次数 net.ipv4.tcp_syn_retries=3 net.ipv4.tcp_synack_retries=3 # TCP SYN 连接超时时间, 设置为 5 约为 30s net.ipv4.tcp_retries2=5 # 开启 SYN 洪水攻击保护 # 注意: tcp_syncookies 启用时, 此时实际上没有逻辑上的队列长度, # Backlog 设置将被忽略. syncookie 是一个出于对现实的妥协, # 严重违反 TCP 协议的设计, 会造成 TCP option 不可用, 且实现上 # 通过计算 hash 避免维护半开连接也是一种 tradeoff 而非万金油, # 勿听信所谓“安全优化教程”而无脑开启 net.ipv4.tcp_syncookies=0 # Ref: https://linuxgeeks.github.io/2017/03/20/212135-Linux%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0rp_filter/ # 开启反向路径过滤 # Aliyun 负载均衡实例后端的 ECS 需要设置为 0 net.ipv4.conf.default.rp_filter=2 net.ipv4.conf.all.rp_filter=2 # 减少处于 FIN-WAIT-2 连接状态的时间使系统可以处理更多的连接 # Ref: https://www.cnblogs.com/kaishirenshi/p/11544874.html net.ipv4.tcp_fin_timeout=10 # Ref: https://xwl-note.readthedocs.io/en/latest/linux/tuning.html # 默认情况下一个 TCP 连接关闭后, 把这个连接曾经有的参数保存到dst_entry中 # 只要 dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接.通常情况下是关闭的 net.ipv4.tcp_no_metrics_save=1 # unix socket 最大队列 net.unix.max_dgram_qlen=1024 # 路由缓存刷新频率 net.ipv4.route.gc_timeout=100 # Ref: https://gist.github.com/lixingcong/0e13b4123d29a465e364e230b2e45f60 # 启用 MTU 探测,在链路上存在 ICMP 黑洞时候有用(大多数情况是这样) net.ipv4.tcp_mtu_probing = 1 # No Ref # 开启并记录欺骗, 源路由和重定向包 net.ipv4.conf.all.log_martians=1 net.ipv4.conf.default.log_martians=1 # 处理无源路由的包 net.ipv4.conf.all.accept_source_route=0 net.ipv4.conf.default.accept_source_route=0 # TCP KeepAlive 调优 # 最大闲置时间 net.ipv4.tcp_keepalive_time=300 # 最大失败次数, 超过此值后将通知应用层连接失效 net.ipv4.tcp_keepalive_probes=2 # 发送探测包的时间间隔 net.ipv4.tcp_keepalive_intvl=2 # 系统所能处理不属于任何进程的TCP sockets最大数量 net.ipv4.tcp_max_orphans=262144 # arp_table的缓存限制优化 net.ipv4.neigh.default.gc_thresh1=128 net.ipv4.neigh.default.gc_thresh2=512 net.ipv4.neigh.default.gc_thresh3=4096 net.ipv4.neigh.default.gc_stale_time=120 net.ipv4.conf.default.arp_announce=2 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_announce=2 # ------ END 网络调优: 其他 ------ # ------ 内核调优 ------ # Ref: Aliyun, etc # 内核 Panic 后 1 秒自动重启 kernel.panic=1 # 允许更多的PIDs, 减少滚动翻转问题 kernel.pid_max=32768 # 内核所允许的最大共享内存段的大小(bytes) kernel.shmmax=4294967296 # 在任何给定时刻, 系统上可以使用的共享内存的总量(pages) kernel.shmall=1073741824 # 设定程序core时生成的文件名格式 kernel.core_pattern=core_%e # 当发生oom时, 自动转换为panic vm.panic_on_oom=1 # 表示强制Linux VM最低保留多少空闲内存(Kbytes) # vm.min_free_kbytes=1048576 # 该值高于100, 则将导致内核倾向于回收directory和inode cache vm.vfs_cache_pressure=250 # 表示系统进行交换行为的程度, 数值(0-100)越高, 越可能发生磁盘交换 vm.swappiness=10 # 仅用10%做为系统cache vm.dirty_ratio=10 vm.overcommit_memory=1 # 增加系统文件描述符限制 # Fix error: too many open files fs.file-max=1048575 fs.inotify.max_user_instances=8192 fs.inotify.max_user_instances=8192 # 内核响应魔术键 kernel.sysrq=1 # 弃用 # net.ipv4.tcp_low_latency=1 # Ref: https://gist.github.com/lixingcong/0e13b4123d29a465e364e230b2e45f60 # 当某个节点可用内存不足时, 系统会倾向于从其他节点分配内存. 对 Mongo/Redis 类 cache 服务器友好 vm.zone_reclaim_mode=0
或者,也可以使用网上大佬写的基于xanmod 内核的一键脚本进行优化
Debian: wget -O - https://raw.githubusercontent.com/xsmzdd/Multiple-concurrent-network-optimization/main/Optimization-2.sh | bash Ubuntu: wget https://raw.githubusercontent.com/xsmzdd/Multiple-concurrent-network-optimization/main/U-Optimization-2.sh -O U-Optimization-2.sh && chmod +x U-Optimization-2.sh && ./U-Optimization-2.sh
脚本内容展示
#!/bin/bash # 更新系统 apt update && apt upgrade -y # 检测是否安装iptables,如果没有则安装 if ! command -v iptables &> /dev/null; then echo "安装 iptables..." apt install -y iptables fi # 获取所有网络接口的名称 interfaces=$(nmcli device status | awk '{print $1}' | grep -v DEVICE) # 循环遍历每个网络接口 for interface in $interfaces; do # 使用nmcli增加环缓冲的大小 echo "Setting ring buffer size for interface $interface..." sudo nmcli connection modify $interface txqueuelen 10000 # 调优网络设备积压队列以避免数据包丢弃 echo "Tuning network device backlog for interface $interface..." sudo nmcli connection modify $interface rxqueuelen 10000 # 增加NIC的传输队列长度 echo "Increasing NIC transmission queue length for interface $interface..." sudo nmcli connection modify $interface transmit-hash-policy layer2+3 done # 备份原始配置文件 cp /etc/sysctl.conf /etc/sysctl.conf.bak # 配置内核参数 cat << EOF > /etc/sysctl.conf # 网络调优: 基本 # 启用 TCP 时间戳 net.ipv4.tcp_timestamps=1 # 网络调优: 内核 Backlog 队列和缓存相关 # 设置默认的发送和接收缓冲区大小 net.core.wmem_default=16384 net.core.rmem_default=262144 # 设置最大的发送和接收缓冲区大小 net.core.rmem_max=536870912 net.core.wmem_max=536870912 # 设置 TCP 的接收和发送缓冲区大小 net.ipv4.tcp_rmem=8192 262144 536870912 net.ipv4.tcp_wmem=4096 16384 536870912 # 禁用 TCP 自动调整窗口大小 net.ipv4.tcp_adv_win_scale=-2 # TCP 协议将最大数据包缩小为最小数据包的上限 net.ipv4.tcp_collapse_max_bytes=6291456 # TCP 发送队列满时,内核会将套接字标记为可写入的下限 net.ipv4.tcp_notsent_lowat=131072 # 设置网络设备接收队列的最大长度 net.core.netdev_max_backlog=10240 # 设置 TCP SYN 队列的最大长度 net.ipv4.tcp_max_syn_backlog=10240 # 设置系统同时保持 SYN_RECV 状态的最大连接数 net.core.somaxconn=8192 # 当连接数达到上限时丢弃新的连接 net.ipv4.tcp_abort_on_overflow=1 # 设置默认的网络队列调度器为 FQ net.core.default_qdisc=fq # 启用 TCP 窗口缩放选项 net.ipv4.tcp_window_scaling=1 # 关闭空闲连接的慢启动 net.ipv4.tcp_slow_start_after_idle=0 # 网络调优: 其他 # 启用 SACK 和 FACK 选项 net.ipv4.tcp_sack=1 net.ipv4.tcp_fack=1 # 设置 TCP SYN 连接的重试次数 net.ipv4.tcp_syn_retries=3 net.ipv4.tcp_synack_retries=3 # 设置 TCP SYN 连接超时重试时间 net.ipv4.tcp_retries2=5 # 禁用 SYN 洪水攻击保护 net.ipv4.tcp_syncookies=0 # 设置反向路径过滤 net.ipv4.conf.default.rp_filter=2 net.ipv4.conf.all.rp_filter=2 # 设置 TCP FIN 连接的超时时间 net.ipv4.tcp_fin_timeout=10 # 禁用保存 TCP 连接信息 net.ipv4.tcp_no_metrics_save=1 # 设置 UNIX 套接字的最大队列长度 net.unix.max_dgram_qlen=1024 # 设置路由缓存刷新频率 net.ipv4.route.gc_timeout=100 # 启用 MTU 探测 net.ipv4.tcp_mtu_probing=1 # 启用并记录欺骗、源路由和重定向包 net.ipv4.conf.all.log_martians=1 net.ipv4.conf.default.log_martians=1 # 禁用接受源路由的包 net.ipv4.conf.all.accept_source_route=0 net.ipv4.conf.default.accept_source_route=0 # 配置 TCP KeepAlive net.ipv4.tcp_keepalive_time=300 net.ipv4.tcp_keepalive_probes=2 net.ipv4.tcp_keepalive_intvl=2 # 设置系统所能处理不属于任何进程的 TCP sockets 最大数量 net.ipv4.tcp_max_orphans=262144 # ARP 表的缓存限制优化 net.ipv4.neigh.default.gc_thresh1=128 net.ipv4.neigh.default.gc_thresh2=512 net.ipv4.neigh.default.gc_thresh3=4096 net.ipv4.neigh.default.gc_stale_time=120 # ARP 报文的发送规则 net.ipv4.conf.default.arp_announce=2 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_announce=2 # 内核调优 # 系统 Panic 后 1 秒自动重启 kernel.panic=1 # 允许更多的 PID kernel.pid_max=32768 # 内核允许的最大共享内存段的大小 kernel.shmmax=4294967296 # 在任何给定时刻,系统上可以使用的共享内存的总量 kernel.shmall=1073741824 # 设置程序 core dump 时生成的文件名格式 kernel.core_pattern=core_%e # 当发生 OOM 时,自动触发系统 Panic vm.panic_on_oom=1 # 决定系统回收内存时对文件系统缓存的倾向程度 vm.vfs_cache_pressure=250 # 决定系统进行交换行为的程度 vm.swappiness=10 # 设置系统 dirty 内存的比例 vm.dirty_ratio=10 # 控制内存过量分配 vm.overcommit_memory=1 # 增加系统文件描述符限制 fs.file-max=1048575 fs.inotify.max_user_instances=8192 # 决定是否开启内核响应魔术键 kernel.sysrq=1 # 控制内存回收机制 vm.zone_reclaim_mode=0 EOF # 应用新的内核参数 sysctl -p # 更新 grub update-grub # 调整网络队列处理算法(Qdiscs),优化TCP重传次数 for interface in $interfaces; do echo "Tuning network queue disciplines (Qdiscs) and TCP retransmission for interface $interface..." sudo tc qdisc add dev $interface root fq sudo tc qdisc change dev $interface root fq maxrate 90mbit sudo tc qdisc change dev $interface root fq burst 15k sudo tc qdisc add dev $interface ingress sudo tc filter add dev $interface parent ffff: protocol ip u32 match u32 0 0 action connmark action mirred egress redirect dev ifb0 sudo tc qdisc add dev ifb0 root sfq perturb 10 sudo ip link set dev ifb0 up sudo ethtool -K $interface tx off rx off done # 调整TCP和UDP流量的优先级 for interface in $interfaces; do echo "Setting priority for TCP and UDP traffic on interface $interface..." sudo iptables -A OUTPUT -t mangle -p tcp -o $interface -j MARK --set-mark 10 sudo iptables -A OUTPUT -t mangle -p udp -o $interface -j MARK --set-mark 20 sudo iptables -A PREROUTING -t mangle -i $interface -j MARK --set-mark 10 sudo iptables -A PREROUTING -t mangle -p udp -i $interface -j MARK --set-mark 20 done # 设置文件描述符限制脚本 #!/bin/bash # 获取内存大小(单位:MB) total_memory=$(free -m | awk '/^Mem:/{print $2}') # 计算文件描述符限制数值 if [[ $total_memory -eq 512 ]]; then limit=4096 else # 每增加512MB内存,文件描述符限制数值乘以2 multiplier=$((total_memory / 512)) limit=$((4096 * multiplier)) fi # 设置文件描述符限制 echo "* hard nofile $limit" >> /etc/security/limits.conf echo "* soft nofile $limit" >> /etc/security/limits.conf echo "文件描述符限制已设置为 $limit" # 提示用户重启系统 echo "系统优化完成,重启系统以应用新的内核"
至此,全部结束。