• linux下改动内核參数进行Tcp性能调优 -- 高并发


    前言:
    Tcp/ip协议对网络编程的重要性,进行过网络开发的人员都知道,我们所编写的网络程序除了硬件,结构等限制,通过改动Tcp/ip内核參数也能得到非常大的性能提升,
    以下就列举一些Tcp/ip内核參数,解释它们的含义并通过改动来它们来优化我们的网络程序,主要是针对高并发情况。
    这里网络程序主要指的是server端


    1. fs.file-max

    最大能够打开的文件描写叙述符数量。注意是整个系统。
    在server中。我们知道每创建一个连接,系统就会打开一个文件描写叙述符,所以,文件描写叙述符打开的最大数量也决定了我们的最大连接数
    select在高并发情况下被代替的原因也是文件描写叙述符打开的最大值,尽管它能够改动但一般不建议这么做,详情可见unp select部分。


    2.net.ipv4.tcp_max_syn_backlog

    Tcp syn队列的最大长度,在进行系统调用connect时会发生Tcp的三次握手,server内核会为Tcp维护两个队列。Syn队列和Accept队列,Syn队列是指存放完毕第一次握手的连接。Accept队列是存放完毕整个Tcp三次握手的连接,改动net.ipv4.tcp_max_syn_backlog使之增大能够接受很多其它的网络连接。
    注意此參数过大可能遭遇到Syn flood攻击,即对方发送多个Syn报文端填充满Syn队列,使server无法继续接受其它连接
    可參考此文http://tech.uc.cn/?p=1790


    3.net.ipv4.tcp_syncookies

    改动此參数能够有效的防范上面所说的syn flood攻击
    原理:在Tcpserver收到Tcp Syn包并返回Tcp Syn+ack包时,不专门分配一个数据区。而是依据这个Syn包计算出一个cookie值。

    在收到Tcp ack包时,Tcpserver在依据那个cookie值检查这个Tcp ack包的合法性。假设合法,再分配专门的数据区进行处理未来的TCP连接。
    默觉得0。1表示开启


    4.net.ipv4.tcp_keepalive_time

    Tcp keepalive心跳包机制。用于检測连接是否已断开。我们能够改动默认时间来间断心跳包发送的频率。
    keepalive通常是server对client进行发送查看client是否在线。由于server为client分配一定的资源。可是Tcp 的keepalive机制非常有争议。由于它们可耗费一定的带宽。
    Tcp keepalive详情见Tcp/ip具体解释卷1 第23章


    5.net.ipv4.tcp_tw_reuse

    我的上一篇文章中写到了time_wait状态,大量处于time_wait状态是非常浪费资源的,它们占用server的描写叙述符等。


    改动此參数。同意重用处于time_wait的socket。


    默觉得0,1表示开启


    6.net.ipv4.tcp_tw_recycle

    也是针对time_wait状态的,该參数表示高速回收处于time_wait的socket。
    默觉得0,1表示开启


    7.net.ipv4.tcp_fin_timeout

    改动time_wait状的存在时间。默认的2MSL
    注意:time_wait存在且生存时间为2MSL是有原因的。见我上一篇博客为什么会有time_wait状态的存在。所以改动它有一定的风险,还是依据具体的情况来分析。


    8.net.ipv4.tcp_max_tw_buckets

    所同意存在time_wait状态的最大数值,超过则立马被清楚而且警告。


    9.net.ipv4.ip_local_port_range

    表示对外连接的端口范围。


    10.somaxconn

    前面说了Syn队列的最大长度限制,somaxconn參数决定Accept队列长度,在listen函数调用时backlog參数即决定Accept队列的长度,该參数太小也会限制最大并发连接数,由于同一时间完毕3次握手的连接数量太小,server处理连接速度也就越慢。server端调用accept函数实际上就是从已连接Accept队列中取走完毕三次握手的连接。


    Accept队列和Syn队列是listen函数完毕创建维护的。


    /proc/sys/net/core/somaxconn改动


    上面每个參数事实上都够写一篇文章来分析了,这里我仅仅是概述下部分參数,注意在改动Tcp參数时我们一定要依据自己的实际需求以及測试结果来决定。


    參考博客:
    http://cenwj.com/2015/2/25/19

  • 相关阅读:
    FATAL ERROR: please install the following Perl modules before executing /usr/bin/mysql_install_db:
    redis分布式锁原理与实现
    java中如何将 string 转化成 long
    FastJson中JSONObject用法及常用方法总结
    Spring IOC 一——容器装配Bean的简单使用
    静态代理和动态代理
    Spring AOP——Spring 中面向切面编程
    什么是分布式锁?实现分布式锁的三种方式
    @Consumes @Produces的作用
    pro、pre、test、dev环境
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5061800.html
Copyright © 2020-2023  润新知