当前位置: 首页 > news >正文

Ubuntu16.04操作系统-内核优化

1. 概述

本文所用优化是生产环境中经过长期验证的内核优化策略,针对的服务器与POD主要用于高CPU、高内存、高IO的业务场景。

备注: OS: ubuntu16.04, 内核: 4.15.0-147-generic

主要涵盖以下内容优化:

  • ulimit优化
  • 加强tcp参数
  • 其他内存参数

2. Node 相关调参汇总

ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。为了让系统能够支持更大的并发,优化linux内核也是重中之重

2.1 最大线程数和文件打开数

编辑 /etc/security/limits.conf

# Standard limits config
*       soft            nofile  20480000
*       hard            nofile  20480000
root       soft            nofile  20480000
root       hard            nofile  20480000
*       soft            core    unlimited
*       hard            core    unlimited
*       soft            nproc   unlimited
*       hard            nproc   unlimited
root       soft            nproc   unlimited
root       hard            nproc   unlimited
  • 调整UserTasksMax,UserTasksMax用于限制一个用户可以创建的最大进程数。
vim /etc/systemd/logind.confUserTasksMax=655350
  • 调整pids.max参数来设定进程的最大数量
echo 655350 > /sys/fs/cgroup/pids/user.slice/user-0.slice/pids.max

pids.max表示当前cgroup中最多允许创建的进程数目。当一个进程尝试创建新的进程时,内核会检查当前cgroup的pids.max限制,如果当前进程数目已经等于或超过了该限制,就会阻止新的进程的创建,并返回相应的错误。
使用cgroup的pids.max限制,可以将系统资源分配给不同的进程,从而避免进程数量过多而导致系统CPU、内存和I/O等资源的耗尽。可以通过修改pids.max参数来设定进程的最大数量,以便更好地分配系统资源。

2.2 sysctl优化

编辑 /etc/sysctl.conf

fs.file-max = 20480000
fs.nr_open = 20480000
#最多打开文件数kernel.msgmnb = 104857600
#ipc消息队列容量kernel.msgmax = 20480000
#ipc消息队列长度kernel.msgmni = 4096000
#ipc消息队列上限制net.ipv4.tcp_syncookies = 1
#打开TCP同步标签(syncookie),防止一个套接字在有过多试图连接到达时引起过载。kernel.core_uses_pid = 1
#使core文件包含pid信息kernel.shmall = 18446744073692774399
#允许使用共享内存大小net.core.somaxconn = 65535
#端口做大监听队列长度net.core.wmem_default = 33554432
#默认的socket发送缓冲区大小net.core.rmem_default = 33554432
#默认的socket接收缓冲区大小net.core.rmem_max = 67108864
#最大的socket接收缓冲区大小net.core.wmem_max = 67108864
#最大的socket发送缓冲区大小net.ipv4.tcp_synack_retries = 1
#内核在放弃连接之前发送SYN+ACK包重试次数tcp_max_tw_bucketsnet.ipv4.tcp_syn_retries = 1
#内核在放弃连接之前发送SYN包重试次数net.ipv4.tcp_tw_recycle = 1
#允许将TIME-WAIT sockets重新用于新的TCP连接net.ipv4.tcp_tw_reuse = 1
#开启TCP连接中TIME-WAIT sockets的快速回收net.ipv4.tcp_mem = 94500000 915000000 927000000
#允许所有tcp sockets用于排队缓冲数据报的页面数量阈值,low,pressure,highnet.ipv4.tcp_rmem = 8192 128000 33554432net.ipv4.tcp_wmem = 8192 128000 33554432net.core.optmem_max = 25165824net.ipv4.tcp_window_scaling = 1net.ipv4.tcp_sack = 1net.ipv4.tcp_fack = 1net.core.netdev_max_backlog = 60000net.ipv4.tcp_no_metrics_save = 1fs.may_detach_mounts = 1net.ipv4.tcp_max_orphans = 3276800
#系统所能处理不属于任何进程的TCP sockets最大数量net.ipv4.ip_local_port_range = 10240 65535
#TCP/UDP协议打开的本地端口号范围net.ipv4.tcp_fin_timeout = 10
#对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间net.ipv4.tcp_keepalive_time = 100
# tcp 心跳保活时间net.ipv4.tcp_max_syn_backlog = 262144
#对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目net.ipv4.tcp_max_tw_buckets = 20000
#系统在同时所处理的最大timewait sockets 数目kernel.perf_event_paranoid = 2
#perf输出信息权限kernel.yama.ptrace_scope = 0
#允许tracenet.ipv4.udp_mem = 67108864 89478485 134217728
#允许所有udp sockets用于排队缓冲数据报的页面数量阈值,low,pressure,highnet.ipv4.udp_rmem_min = 33554432
#udp接受缓存最小值net.ipv4.udp_wmem_min = 33554432
#udp发送缓存最小值kernel.pid_max = 655300
#系统允许的最大线程数kernel.sem = 2500 64000 320 1280
#ipc sem相关配数目阈值vm.overcommit_memory = 1
#内核允许分配所有的物理内存,而不管当前的内存状态如何fs.file-max = 20480000
#系统所有进程总共可以打开的文件数量fs.inotify.max_user_instances = 1280
#每一个real user ID可创建的inotify instatnces的数量上限vm.swappiness = 10
#更倾向于使用内存而非swap分区net.ipv4.neigh.default.gc_thresh1 = 2048
#arp表gc 参数net.ipv4.neigh.default.gc_thresh2 = 4096
#arp表gc 参数net.ipv4.neigh.default.gc_thresh3 = 8192
#arp表gc 参数fs.inotify.max_queued_events = 163840
#fsnotify 文件该表通知相关参数fs.inotify.max_user_instances = 12800
#fsnotify 文件该表通知相关参数fs.inotify.max_user_watches = 81920
#fsnotify 文件该表通知相关参数net.netfilter.nf_conntrack_tcp_timeout_established = 1200
#nf跟踪表超时参数net.netfilter.nf_conntrack_max = 4116480
#nf跟踪表最大阈值net.nf_conntrack_max = 4116480
#nf跟踪表最大阈值net.ipv4.ip_local_reserved_ports = 5666,59317-59367,10248,10250,10255,10520
#本地保留端口vm.max_map_count = 2097152
#map的最大内存个数net.ipv4.ipfrag_high_thresh = 419430400
#ip 分片的内存阈值net.ipv4.ipfrag_low_thresh = 314572800
#ip 分片的内存阈值net.ipv4.ipfrag_time = 100
#ip 分片的内存阈值net.ipv4.ip_forward = 1
#开启ip转发fs.mqueue.msg_default = 100
#fs 消息队列参数fs.mqueue.msg_max = 100
#fs 消息队列参数fs.mqueue.msgsize_default = 32768
#fs 消息队列参数fs.mqueue.msgsize_max = 32768
#fs 消息队列参数fs.mqueue.queues_max = 2560
#fs 消息队列参数net.ipv4.tcp_timestamps = 0
#关闭tcp timestamps校验,容器fullnat 模式下不校验timestamp 防止协议栈拒绝tcp 请求

2.3 tcp 握手队列相关优化

net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192# 端口范围
net.ipv4.ip_local_port_range = "1024 65000"# timewait相关优化
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_fin_timeout = 30

2.4 优化 arp 缓存的 gc 阀值

# 以下三个参数是 arp 缓存的 gc 阀值,相比默认值提高了,避免在某些场景下arp缓存溢出导致网络超时,参考:https://k8s.imroc.io/troubleshooting/cases/arp-cache-overflow-causes-healthcheck-failed
net.ipv4.neigh.default.gc_thresh1="2048"
net.ipv4.neigh.default.gc_thresh2="4096"
net.ipv4.neigh.default.gc_thresh3="8192"

2.5 开启 ipv4 转发

net.ipv4.tcp_max_orphans="32768"
vm.max_map_count="262144"
kernel.threads-max="30058"
net.ipv4.ip_forward="1"

2.6 转发磁盘 IO 优化

# 磁盘 IO 优化: https://www.cnblogs.com/276815076/p/5687814.html
# vm.dirty_background_bytes和vm.dirty_bytes是另一种指定这些参数的方法。如果设置_bytes版本,则_ratio版本将变为0,反之亦然。
# 可以通过下面方式看内存中有多少脏数据:cat /proc/vmstat | egrep "dirty|writeback", nr_dirty 值表示多少页
# vm.dirty_background_bytes = 0
# vm.dirty_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 300
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 50
vm.dirtytime_expire_seconds = 43200# fd优化
fs.file-max=655360
fs.inotify.max_user_instances="8192"
fs.inotify.max_user_watches="524288"
# 最大线程数量
kernel.pid_max = 655350# 系统保留的空闲物理内存大小
vm.min_free_kbytes=2097152

3. Pod 相关调参汇总

# socket buffer优化
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_rmem = 4096        87380   6291456
net.ipv4.tcp_mem = 381462       508616  762924
net.core.rmem_default = 8388608
# 读写 buffer 调到 25M 避免大流量时导致 buffer 满而丢包 "netstat -s" 可以看到 receive buffer errors 或 send buffer errors
net.core.rmem_max = 26214400 
net.core.wmem_max = 26214400# timewait相关优化
# 这个优化意义不大
net.ipv4.tcp_max_tw_buckets = 131072 
# 通常默认本身是开启的
net.ipv4.tcp_timestamps = 1  
# 仅对客户端有效果,对于高并发客户端,可以复用TIME_WAIT连接端口,避免源端口耗尽建连失败
net.ipv4.tcp_tw_reuse = 1 
# 对于高并发客户端,加大源端口范围,避免源端口耗尽建连失败(确保容器内不会监听源端口范围的端口)
net.ipv4.ip_local_port_range="1024 65535" 
# 缩短TIME_WAIT时间,加速端口回收
net.ipv4.tcp_fin_timeout=30 # 握手队列相关优化
# 没有启用syncookies的情况下,syn queue(半连接队列)大小除了受somaxconn限制外,也受这个参数的限制,默认1024,优化到8096,避免在高并发场景下丢包
net.ipv4.tcp_max_syn_backlog = 10240 
# 表示socket监听(listen)的backlog上限,也就是就是socket的监听队列(accept queue),当一个tcp连接尚未被处理或建立时(半连接状态),会保存在这个监听队列,默认为 128,在高并发场景下偏小,优化到 32768。参考 https://imroc.io/posts/kubernetes-overflow-and-drop/
net.core.somaxconn = 65535 
net.ipv4.tcp_syncookies = 1# fd优化
# 提升文件句柄上限,像 nginx 这种代理,每个连接实际分别会对 downstream 和 upstream 占用一个句柄,连接量大的情况下句柄消耗就大。
fs.file-max=1048576 
# 表示同一用户同时最大可以拥有的 inotify 实例 (每个实例可以有很多 watch)
fs.inotify.max_user_instances="8192" 
# 表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量) 默认值 8192 在容器场景下偏小,在某些情况下可能会导致 inotify watch 数量耗尽,使得创建 Pod 不成功或者 kubelet 无法启动成功,将其优化到 524288
fs.inotify.max_user_watches="524288" 

相关文章:

Ubuntu16.04操作系统-内核优化

1. 概述 本文所用优化是生产环境中经过长期验证的内核优化策略,针对的服务器与POD主要用于高CPU、高内存、高IO的业务场景。 备注: OS: ubuntu16.04, 内核: 4.15.0-147-generic 主要涵盖以下内容优化: ulimit优化加强tcp参数其他内存参数 …...

Qt/C++编写的Onvif调试助手调试神器工具/支持云台控制/预置位设置等/有手机版本

一、功能特点 广播搜索设备,支持IPC和NVR,依次返回。可选择不同的网卡IP进行对应网段设备的搜索。依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。可对每个设备设…...

【原创】java+swing+mysql密码管理器系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片,希望和大家…...

JavaEE-HTTPHTTPS

目录 HTTP协议 一、概念 二、http协议格式 http请求报文 http响应报文 URL格式 三、认识方法 四、认识报头 HTTP响应中的信息 HTTPS协议 对称加密 非对称加密 中间人攻击 解决中间人攻击 HTTP协议 一、概念 HTTP (全称为 "超⽂本传输协议") 是⼀种应⽤…...

iLogtail 开源两周年:社区使用调查报告

作者:玄飏 iLogtail 作为阿里云开源的可观测数据采集器,以其高效、灵活和可扩展的特性,在可观测采集、处理与分析领域受到了广泛的关注与应用。在 iLogtail 两周年之际,我们对 iLogtail 开源社区进行了一次使用调研,旨…...

Ubuntu 比较两个文件夹

比较两个文件夹下的大量文件是否一致,可以通过以下几种方式完成: 1. 使用 diff 命令 diff 命令不仅可以比较文件,还能递归比较文件夹。可以使用 -r 选项来递归比较两个目录下的文件: diff -r /path/to/dir1 /path/to/dir2 如…...

两数之和--力扣1

两数之和 题目思路C代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们…...

vue原理分析(三)new()创建Vue实例

今天我们来分析Vue实例的创建 代码如下: Vue.config.productionTip falsenew Vue({render: h > h(App),}).$mount(#app) Vue.config.productionTip false 这个配置成false,是阻止启动生产消息 new Vue({render: h > h(App),}).$mount(#app)…...

Spring MVC: 构建Web应用的强大框架

Spring MVC: 构建现代Web应用的强大框架 1. MVC设计模式简介 MVC (Model-View-Controller) 是一种广泛使用的软件设计模式,它将应用程序的逻辑分为三个相互关联的组件: Model (模型): 负责管理数据、业务逻辑和规则。View (视图): 负责用户界面的展示,将数据呈现给用户。Con…...

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-Gigabi…...

动态规划-最长回文子串

题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 对于该题使用中心扩展法在某些情况下可以比动态规划方法更优&#xff0c;尤其是在处理较长字符串时。这是因为中心扩展法具有更好的空间复杂度&#xff0c;并且在实际应用中可能具有更快的运行速度&#xf…...

海康威视 嵌入式 面经 海康威视嵌入式软件 嵌入式硬件总结面试经验 面试题目汇总

标题海康威视 嵌入式 面经 海康威视嵌入式软件 嵌入式硬件总结面试经验 面试题目汇总 整理总结了海康威视嵌入式的面试题目&#xff01;&#xff0c;可以供大家面试参考 标题海康威视 嵌入式 面经 五月底投递&#xff0c;六月初面试&#xff0c;一场技术面&#xff0c;一场H…...

使用图论技巧——有遍数限制的最短路

给定一个 n个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从 11 号点到 n 号点的最多经过 k 条边的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;输出 impossible。 注意&#xff1a;图中可能 存在负权回路…...

flume 使用 exec 采集容器日志,转储磁盘

flume 使用 exec 采集容器日志&#xff0c;转储磁盘 在该场景下&#xff0c;docker 服务为superset&#xff0c;flume 的sources 选择 exec &#xff0c; sinks选择 file roll 。 任务配置 具体配置文件如下&#xff1a; #simple.conf: A single-node Flume configuration#…...

459重复的子字符串

给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 public repeatedSubstringPattern(String s){int n s.length();for(int i 1; i < n / 2; i){if(n % i ! 0) continue;// substring获取子字符串是左闭右开的String ss s.substring(0,…...

【HarmonyOS NEXT】实现截图功能

【HarmonyOS NEXT】实现截图功能 【需求】 实现&#xff1a;实现点击截图按钮&#xff0c;实现对页面/组件的截图 【步骤】 编写页面UI Entry Component struct Screenshot {BuildergetSnapContent() {Column() {Image().width(100%).objectFit(ImageFit.Auto).borderRadi…...

小皮面板webman ai项目本地启动教程

1.前置条件 下载小皮面板 下载后&#xff0c;双击安装&#xff0c;一路next&#xff08;下一步&#xff09;&#xff0c;无需更改配置。 2.安装必须软件 在小皮面板的软件管理页&#xff0c;安装编号①②③④下面四个软件。 3.启动本地服务 进入到小皮面板的首页&#x…...

从零实现诗词GPT大模型:实现多头自注意力

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 在上一篇文章的最后,我们已经介绍了为什么要使用多头注意力了,本篇文章我们主要来实现多头自注意力,然后综合我们之前实现的FFN和TransformerBlock其实就差不多完成了整个GPT模型的实现了。 在开始实现之…...

[rk3399 android11]关闭声卡

使用以下命令查看声卡&#xff0c;可以看到目前有三个声卡 cat /proc/asound/cards 修改设备树 diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-jw-d039.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3399-jw-d039.dtsindex 515334c127..5b592a852f 100755--- a/…...

项目实战 ---- 商用落地视频搜索系统(7)---预处理二次优化

目录 背景 要解决的问题 技术理念与落地思路 完整代码 另外的问题与解决 优化运行效果 log 效果图 背景 作为商用落地系统,我们当然希望搜索视频的关联度或者说准确性与我们希望查询的视频相关度越高越好。为此,除了在query 层面上优化,我们还需要注重我们的录入数…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技

无需布线的革命&#xff1a;电力载波技术赋能楼宇自控系统 在楼宇自动化领域&#xff0c;传统控制系统依赖复杂的专用通信线路&#xff0c;不仅施工成本高昂&#xff0c;后期维护和扩展也极为不便。电力载波技术&#xff08;PLC&#xff09;的突破性应用&#xff0c;彻底改变了…...