Linux内核调优-程序员宅基地

技术标签: Linux运维  Linux内核调优  

一、优化文件打开数和打开系统进程数

为了防止失控的进程破坏系统的性能,Unix和Linux会跟踪进程使用的大部分资源,会对用户及系统管理员进行资源限制,例如控制某个用户打开文件最大数、对某个用户打开进程数进行限制等,一般限制手段包括:软限制和硬限制。
注:软限制并没有太多的用,一般这两者的值都是设置相等的。

1、打开文件最大数临时设置方法:
  • 重启服务器该参数无效,命令行终端执行如下命令:
ulimit   -n  65535
  • 永久设置方法

将如下代码加入内核限制文件/etc/security/limits.conf的末尾:

* 	soft 	noproc			65535
* 	hard 	noproc			65535
* 	soft 	nofile			65535
* 	hard 	nofile			65535

如果需要对Linux整个系统设置文件最大数限制,需要修改/proc/sys/fs/file-max中的值,该值为Linux总文件打开数,例如设置为:echo 3865161233 >/proc/sys/fs/file-max。
"*"表示所有用户。如果改成root就表示对root用户的限制。

2、文件描述符
我们打开一个服务,会起很多进程,进程又会打开很多的文件,比如服务配置文件、日志文件等等,<font color=red>文件描述符便是内核为了高效管理已被打开的文件所创建的索引。</font>

我们现在看下nginx主进程的所有文件描述符:
在这里插入图片描述在这里插入图片描述注:文件描述符是非负小整数!


扩展知识(非重点):
Linux系统为每个进程维护了一个文件描述符表,该表的值都从0开始的,在不同的进程中你会看到相同的文件描述符,相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。Linux内核对文件操作,维护了3个数据结构概念如下:

  • 进程级的文件描述符表;
  • 系统级的打开文件描述符表;
  • 文件系统的i-node表;

三者之间的区别请自行google搜索!

二、TCP的三次握手和四次断开

在这里插入图片描述使用tcpdump抓包分析:
确保自己的Nginx已经成功部署!
在这里插入图片描述

tcpdump -i ens33 -nn host 172.16.193.201 and port 80 #抓取所有经过ens33,目的或源地址:端口是172.16.193.201:80的网络数据
-i:指定本地监控的网络接口
-n:对地址以数字方式显式,否则显式为主机名;
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名;

访问一下Nginx。
三次握手:
在这里插入图片描述四次断开:
在这里插入图片描述

三、内核参数优化

Linux /proc/sys目录下存放着多数内核的参数,并且可以在系统运行时进行更改,一般重新启动机器就会失效;/proc/sys下内核文件与配置文件/etc/sysctl.conf中变量存在着对应关系,即修改sysct.conf配置文件,其实是修改/proc/sys相关参数!

1、BAT企业生产环境内核完整参数:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65535
2、Linux内核常见参数详解
net.ipv4.tcp_timestamps = 1 //该参数控制RFC 1323 时间戳与窗口缩放选项;
net.ipv4.tcp_sack = 1 //选择性应答(SACK)是 TCP 的一项可选特性,可以提高某些网络中所有可用带宽的使用效率;
net.ipv4.tcp_fack = 1 //打开FACK(Forward ACK) 拥塞避免和快速重传功能;
net.ipv4.tcp_retrans_collapse = 1  //打开重传重组包功能,为0的时候关闭重传重组包功能;
net.ipv4.tcp_syn_retries = 5 //对于一个新建连接,内核要发送多少个SYN 连接请求才决定放弃;
net.ipv4.tcp_synack_retries = 5
tcp_synack_retries //显示或设定Linux在回应SYN要求时尝试多少次重新发送初始SYN,ACK封包后才决定放弃;
net.ipv4.tcp_max_orphans = 131072 //系统所能处理不属于任何进程的TCP sockets最大数量;
net.ipv4.tcp_max_tw_buckets = 5000//系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息;默认为180000,设为较小数值此项参数可以控制TIME_WAIT套接字的最大数量,避免服务器被大量的TIME_WAIT套接字拖死;

net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3
//如果某个TCP连接在空闲30秒后,内核才发起probe(探查);
//如果probe 3次(每次3秒既tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为该连接已失效;

net.ipv4.tcp_retries1 = 3 //放弃回应一个TCP 连接请求前﹐需要进行多少次重试;
net.ipv4.tcp_retries2 = 15 //在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试;
net.ipv4.tcp_fin_timeout = 30 //表示如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2状态的时间;
net.ipv4.tcp_tw_recycle = 1 //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_max_syn_backlog = 8192 //表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数;
net.ipv4.tcp_syncookies = 1 //TCP建立连接的 3 次握手过程中,当服务端收到最初的 SYN 请求时,会检查应用程序的syn_backlog队列是否已满,启用syncookie,可以解决超高并发时的Can’t  Connect` 问题。但是会导致 TIME_WAIT 状态fallback为保持2MSL时间,高峰期时会导致客户端无可复用连接而无法连接服务器;
net.ipv4.tcp_orphan_retries = 0 //关闭TCP连接之前重试多少次;
net.ipv4.tcp_mem = 178368  237824     356736
net.ipv4.tcp_mem[0]:  //低于此值,TCP没有内存压力;
net.ipv4.tcp_mem[1]:  //在此值下,进入内存压力阶段; 
net.ipv4.tcp_mem[2]:  //高于此值,TCP拒绝分配socket;
net.ipv4.tcp_tw_reuse = 1 //表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接;
net.ipv4.ip_local_port_range = 1024 65000 //表示用于向外连接的端口范围;
net.ipv4.ip_conntrack_max = 655360 //在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目);
net.ipv4.icmp_ignore_bogus_error_responses = 1 //开启恶意icmp错误消息保护;
net.ipv4.tcp_syncookies = 1 //开启SYN洪水攻击保护。
3、Linux内核常用参数详解
net.ipv4.tcp_sack = 1 //选择性应答(SACK)是 TCP 的一项可选特性,可以提高某些网络中所有可用带宽的使用效率;
net.ipv4.tcp_fack = 1 //打开FACK(Forward ACK) 拥塞避免和快速重传功能;
net.ipv4.tcp_syn_retries = 5 //对于一个新建连接,内核要发送多少个SYN 连接请求才决定放弃;
net.ipv4.tcp_synack_retries = 5 //tcp_synack_retries显示或设定Linux在回应SYN要求时尝试多少次重新发送初始SYN,ACK封包后才决定放弃;
net.ipv4.tcp_max_tw_buckets = 5000//系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息;默认为180000,设为较小数值此项参数可以控制TIME_WAIT套接字的最大数量,避免服务器被大量的TIME_WAIT套接字拖死;

net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3 
//如果某个TCP连接在空闲30秒后,内核才发起probe(探查);
//如果probe 3次(每次3秒既tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为该连接已失效;

net.ipv4.tcp_fin_timeout = 30 //表示如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2状态的时间;
net.ipv4.tcp_tw_recycle = 1 //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_syncookies = 1//TCP建立连接的 3 次握手过程中,当服务端收到最初的 SYN 请求时,会检查应用程序的syn_backlog队列是否已满,启用syncookie,可以解决超高并发时的Can’t  Connect` 问题。但是会导致 TIME_WAIT 状态fallback为保持2MSL时间,高峰期时会导致客户端无可复用连接而无法连接服务器;
net.ipv4.tcp_orphan_retries = 0 //关闭TCP连接之前重试多少次;
net.ipv4.tcp_tw_reuse = 1 //表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接;
net.ipv4.ip_local_port_range = 1024 65000 //表示用于向外连接的端口范围;
net.ipv4.ip_conntrack_max = 655360 //在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目);
net.ipv4.tcp_syncookies = 1 //开启SYN洪水攻击保护。

四、Linux内核报错剖析

1、time wait bucket table overflow错误
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow

根据TCP协议定义的3次握手及四次断开连接规定,发起socket主动关闭的一方Socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime)。
net.ipv4.tcp_max_tw_buckets值设置过小导致,当系统Time wait数量超过默认设置的值,即会抛出如上的警告信息,需要增加net.ipv4.tcp_max_tw_buckets的值,警告信息消除。
当然也不能设置过大,对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的Socket,甚至比处于Established状态下的Socket多的多,严重影响服务器的处理能力,甚至耗尽可用的Socket而停止服务,TIME_WAIT是TCP协议用以保证被重新分配的Socket不会受到之前残留的延迟重发报文影响的机制,是TCP传输必要的逻辑保证。

2、Too many open files错误
Benchmarking localhost (be patient)
socket: Too many open files (24)
socket: Too many open files (24)
socket: Too many open files (24)
socket: Too many open files (24)
socket: Too many open files (24)

将如下代码加入内核限制文件/etc/security/limits.conf,重启服务器生效!

* 	soft 	noproc			65535
* 	hard 	noproc			65535
* 	soft 	nofile			65535
* 	hard 	nofile			65535
3、DDOS攻击防护:possible SYN flooding on port 80. Sending cookies.错误
May 31 14:20:14 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:21:28 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:22:44 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:25:33 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:27:06 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:28:44 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:28:51 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:31:01 localhost kernel: possible SYN flooding on port 80. Sending cookies.

此问题是由于SYN 队列已满,而触发SYN cookies,一般是由于大量的访问,或者恶意访问导致,也称之为SYN Flooding洪水攻击。它是DDOS攻击中的一种。

防护DDOS攻击有两种手段,一是基于硬件专业防火墙、二是基于Linux内核简单防护,如果攻击流量特别大,单纯配置内核参数是无法抵挡的,还得依靠专业级硬件防火墙,

如下为Linux内核防护DDOS优化参数,加入如下代码即可:

net.ipv4.tcp_fin_timeout = 30 
net.ipv4.tcp_keepalive_time = 1200 
net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.ip_local_port_range = 1024 65000 
net.ipv4.tcp_max_syn_backlog = 8192 
net.ipv4.tcp_max_tw_buckets = 8000 
net.ipv4.tcp_synack_retries = 2 
net.ipv4.tcp_syn_retries = 2
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44571270/article/details/104879180

智能推荐

#ifndef的用法-程序员宅基地

文章浏览阅读10w+次,点赞142次,收藏395次。头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的: #ifndef #define_#ifndef

java2d javafx_学习JavaFX(一):初步认识GUI设计-程序员宅基地

文章浏览阅读314次。JavaFX v.s. JavaJavaFX:声明式、静态类型的脚本语言;它具有一等函数、声明的语法、列表推导,以及基于依赖关系的增量式求值等特征;JavaFX 脚本式语言特别适用于Java2D swing GUI组件,它允许简单地创建图形界面;在JavaFX中可以直接调用Java的算术、逻辑运算符,instance等操作符,还可以显式调用Java类库和方法;使用JavaFX可以轻松的编写跨平台的..._jframe javafx

hive常见语法错误分组聚合_hive跑聚合函数老出问题-程序员宅基地

文章浏览阅读1.3k次。一、hive常见语法错误 图 1.1当我们在用hive进行数据表的操作时 我们会用得到group by函数那么如图1.1所示假如按照 name 和 month 进行分组SELECT tl.name ,tl.month,max(tl.amount) ASmonth_amount,sum(tr.amount)_hive跑聚合函数老出问题

Android10 NotificationCompat.Builder使用_notificationcompat.builder 设置应用名称-程序员宅基地

文章浏览阅读829次。文章目录1.弃用构造函数2.新方法使用参考链接可用构造函数3.结果1.弃用构造函数@Deprecated public Builder(android.content.Context context)2.新方法使用参考链接参考链接:https://www.cnblogs.com/chunshu/p/10317960.html可用构造函数public Builder(@NonNull android.content.Context context, @NonNu_notificationcompat.builder 设置应用名称

cas搭建后测试以及问题引出_这么测试cas对接成功-程序员宅基地

文章浏览阅读597次。目录概要cas服务端测试idea配置tomcat概要在上两篇的教程中(cas服务端搭建、cas客户端搭建)仅仅是对搭建流程以及启动方式进行一个文字说明,具体测试过程中可能出现的问题,也还没有涉及,因此本篇课程主要就是带着大家从cas客户端到cas服务端的整体联调,以及引出相关的问题并进行解决。cas服务端测试在cas服务端搭建教程的第五小节介绍了启动cas服务的两种方式,我们现在使用外置tomcat启动方式,从idea配置到启动,再到测试登录进行统一的分步骤说明。idea配置tomcat这一步其_这么测试cas对接成功

kernel panic 调试方法(2)-Oops信息的调试及栈回溯_kernel 崩溃但是没有oops打印信息-程序员宅基地

文章浏览阅读686次。Oops 信息来源及格式Oops 这个单词含义为“惊讶”,当内核出错时(比如访问非法地址)打印出来的信息被称为 Oops 信息。Oops 信息包含以下几部分内容。1 一段文本描述信息。比如类似“Unable to handle kernel NULL pointer dereference at virtual address 00000000”的信息,它说明了_kernel 崩溃但是没有oops打印信息

随便推点

Flink UI: Flink 1.10 如何查看 数据源 的背压(反压)情况(消费kafka)_flink如何查看背压-程序员宅基地

文章浏览阅读3k次。1.美图2. 概述想对一个flink程序进行性能测试,因此你需要知道flink消费程序的上限,因此,怎么知道你flink程序有没有达到上限呢?在界面上就能看到,比如我kafka写入的速度是 每秒4万条数据写入到kafka。在界面上找到你的数据源,然后点击,这个界面需要等待一会才有数据如果出现上述情况,那么说明已经达到flink消费的最大速度了。背压很高..._flink如何查看背压

Android使用https链接_file:///android_asset/cac/warning.html-程序员宅基地

文章浏览阅读8.8w次。Https与Http类似,只不过Https一般是通过post请求服务器,但是Https与http不同的是Https与服务器会话是处于连接状态。http则发送请求后连接就会断开。另外使用HttpsURLConnection时需要实现HostnameVerifier 和 X509TrustManager,这两个实现是必须的,要不会报安全验证异常。package cn.yws.httpstest_file:///android_asset/cac/warning.html

docker 在push镜像到本地registry出现的500 Internal Server Error_retrying in 1 second-程序员宅基地

文章浏览阅读1.6w次。在push镜像到本地registry时,出现以下错误:]# docker push 192.168.163.131:5000/testThe push refers to a repository [192.168.163.131:5000/test]9ec45e5f0334: Retrying in 1 second 33f1a94ed7fc: Retrying in 1 second_retrying in 1 second

Navicat连接Oracle时报错ORA-28547:connection to server failed,probable Oracle Net admin error_navicate 链接oracle 报错 net admin erro-程序员宅基地

文章浏览阅读3.8k次。问题描述: Navicat连接Oracle时报错: ORA-28547:connection to server failed,probable Oracle Net admin error 问题原因:oci.dll版本不对,Navicat本地的OCI版本..._navicate 链接oracle 报错 net admin erro

Qt Quick实现的涂鸦程序_qml unable to assign int to qobject*-程序员宅基地

文章浏览阅读784次。之前一直以为 Qt Quick 里 Canvas 才可以自绘,后来发觉不是,原来还有好几种方式都可以绘图!可以使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染),可以构造QSGNode 来绘图,还可以使用 QPainter !哇, QPainter 我很熟悉啊。于是,我用 QPainter 结合 QML 实现了一个简单的涂鸦程序: PaintedItem 。它有下列功能:_qml unable to assign int to qobject*

php 定时缓存,php怎么设置缓存时间-程序员宅基地

文章浏览阅读633次。php设置缓存时间的方法:首先创建一个PHP示例文件;然后通过“if(is_file('./index.html') && (time()-filemtime('./index.html')) < 60){...}”方法设置缓存时间即可。推荐:《PHP视频教程》本教程操作环境:Windows7系统、PHP5.6版适用于所有品牌电脑php处理静态页面:页面设置缓存时间1.页面添..._(time()-filemtime