Linux下sysctl.conf文件的作用

2 阅读3分钟

前言

工作中经常会在Linux上做一些操作,但是别人问起来,你会什么Linux操作呀?抓耳挠腮一顿可能很多人只能回答,我会在linux系统上看日志,我会在linux上部署应用,当再问的具体了,那就是一些创建目录啊、tail看实时日志呀,比较熟练的此时可能会讲awk、grep、sed之类的命令。虽然知道上述这些内容就可以处理很多问题,但是还有一些系统级别的概念我们接触的少,也容易忽略。

sysctl.conf文件是干什么的?

sysctl.conf文件是用于配置内核参数的,文件路径为/etc/sysctl.conf,该文件可以决定系统的性能,以及安全。

什么场景下需要修改该文件

下面通过一个例子来看下什么时候需要修改sysctl.conf文件。

数据库主备切换后程序是否需要关心连接哪个库?

笔者之前有一段时间协助测试做过系统的高可用测试,高可用顾名思义就是系统中个别服务发生宕机或者其他不可用的情况下不影响外部访问。当时的场景是,当数据库因故障发生主备切换时,应用程序应该不受影响或者很短暂的被影响,短时间内能自动恢复正常,那么这种场景下,就要应用程序也自动连接到备机上。但是这个实现并不是由应用程序去实现的,一般各厂商的jdbc实现中已经为我们做了实现,我们不需要关注连接的具体目标库。

jdbc如何知道数据库发生了切换?

虽然我没有看过数据库厂商的事项细节,但是可以大胆的猜测一下,jdbc也有类似心跳机制和数据库保持连接,一旦数据库发生故障,则心跳会中断,当连续中断多次后,此时便开始做故障转移,继续连接jdbc中配置的下一个ip地址的数据库。心跳实现一般都是基于tcp协议来实现的。

改sysctl.conf文件的目的是什么?

既然知道了心跳是基于tcp来实现的,那么心跳中断几次系统会认为数据库不可用呢? 如下,系统默认tcp发包失败15次才认为发包失败,因此为了快速进行切换,系统部署时一般会将net.ipv4.tcp_retries2调整为5.

#TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源
net.ipv4.tcp_retries2 = 5

#以下3个参数与TCP KeepAlive有关.默认值是:

#tcp_keepalive_time = 7200 seconds (2 hours)

#tcp_keepalive_probes = 9

#tcp_keepalive_intvl = 75 seconds

#意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效

#对服务器而言,显然上述值太大.可调整到:

net.ipv4.tcp_keepalive_time = 1800

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_intvl = 30

#表示开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭

net.ipv4.tcp_syncookies = 1

总结

以上只是我实际修改过的一个案例,还有很多功能都可以通过调整sysctl.conf来优化的。比如做ipv6的时候,需要调整ip优先级,也需要修改这个文件。