RHCA442学习笔记-Unit13网络性能调整

时间:2021-01-18 00:18:52
  
UNIT 13 Essential Network Tuning 网络性能调整
 
     目标:1. 应用队列技术最大化网络吞吐量
           2. 调整TCP和non-TCP网络sockets的buffer
    
 13.1 Simplified transmit model 简化传输的模式
      A. Output/writer发送数据
        a. 把数据传到socket ”file” (相当于传输了buffer) **
        b. 内核把数据封装到PDU(协议数据单元)
        c. PDU会被传送到每个设备传输队列   **
        d. 驱动程序会把队列最前面的PDU传送到网卡
        e. PDU到达后网卡会提升中断号
 
13.2 Simplified receive model 简化接收的模式
A. Input/reader 接收数据
        a. 网卡接收到发来的数据帧后用DMA把帧拷贝到接收buffer
        b. 网卡提升CPU中断号
        c. 内核对中断号进行处理并调度一个软中断
        d. 软中断处理完后把数据包放到IP层并由路由决定发送到哪个地址
        e. 本地主机接收到后:
           1)把接收到的数据包解封装放到socket 的接收buffer里面
           2) 从socket 的等待队列里唤醒进程
           3) 进程从socket 接收buffer读取数据。
 
13.3 Kernel socket buffers
     A. Kernel buffers
       a. UDP:core read and write buffers 核心读写buffer
       b. TCP: core+TCP read and write buffers
       c. Fragmentation buffer 碎片buffer
       d. DMA for NIC receive
     B.内核会根据流量自动调整buffer的大小
       a. buffer 必须是空闲的内存页
       b. buffer太大会增加ZONE_NORMAL的 压力
       c. 接收数据流量的多少取决于buffer的大小。
        
13.3 Calculating total buffer size 计算整个buffer的大小
 A.Bandwidth delay product (DBP) :单次发送数据包的数量
      Lpipe=Bandwidth * DelayRTT = A * W 带宽*延时= Buffer size
      用ping命令计算RTT(延时)
 B.  All connections share pipe 所有连接共享pipe时 :
   Socket buffer =DBP / #sockets (接口数)
 
13.4   Calculating per-socket buffer size 计算每个socket buffer大小
   Max connections => Min buffer
   Min connections => Max buffer
   连接数越大,buffer变小
   连接数越小,buffer变大。
 
13.5 Tuning core buffer size (UDP) 调整UDP buffer大小
  A. 在/etc/sysctl.conf 文件里调整 BDP/#connections buffer
    a.   Input/reader in Bytes 接收数据
      net.core.rmem_default   默认值
      net.core.rmem_max     最大值
    b.  Output/write in Bytes 发送数据
      net.core.wmem_default
      net.core.wmem_max
  B.   Reload /etc/sysctl.conf
    sysctl –p
 
13.6 Tuning TCP buffer size 调整TCP buffer 大小
      A. Tune core buffers for DBP / #connections
      B. 在/etc/sysctl.conf 文件里调整TCP buffer
         a. TCP 内存总页面数
           net.ipv4.tcp_mem
         b. Input/reader in Bytes 接收数据
            net.ipv4.tcp_rmem
         c. Output/writer in Bytes 发送数据
            net.ipv4.tcp_wmem
 C.  Reload /etc/sysctl.conf
        Sysctl -p
 注: 以上每个参数都有三个值:最小值,默认值,最大值
        最大值一般设为默认值的1.5倍.
 
13.7   Tuning DMA buffer size 调整DMA buffer 大小
  A.  如果NIC driver 有DMA buffer可调整的话:
    Modinfo –p e1000 查看网卡模块信息
  B. 更新 /etc/modprobe.conf
        alias eth0 e1000
       options eth0 RxDescriptors=1024 TxDescriptors=1024
  C.  TCP connections :
        Increase socket buffer size by 25% 增加socket buffer * 25%
 
13.8    Is packet fragmentation a problem ?
  A.  查看各种协议数据包情况
        netstat –s
  B. 查看数据包重组失败情况
      cat /proc/net/snmp | grep ‘^Ip:’ | cut –f17 –d ‘’
      注: 重组失败表明需要调整buffer
  C. 引起碎片的原因:
    a. Denial of Service (DOS) attacks   DOS攻击
    b. NFS
    c. Noisy networks
    d. Failing network electronics 网络底层物理链路电子信号问题
 
13.9  Tuning fragmentation buffers 调整碎片buffer
       
        net.ipv4.ipfrag_time 碎片在buffer里停留的时间,默认值30秒,超时丢弃。
        net.ipv4.ipfrag_high_thresh: 默认值262144bytes, 256KiB
  net.ipv4.ipfrag_low_thresh: 默认值196608bytes, 192KiB
        当buffer空间大于这个值时,后面新增的碎片会被丢弃,直到buffer的值net.ipv4.ipfrag_low_thresh的值以下碎片才重新重组。
  注: NFS SMB 等服务很容易造成碎片,所以使用这些服务时可以适当调大buffer 值,但调得太大的话也会造成网络延时。
 
13.10 Network interrupt handling 网络中断处理
     A. 网卡为每一个数据包分配一个硬CPU中断。
         a. 为每个进程接收队列调度一个软中断。
     B. 中断处理会抢占进程队列:
        a. 传输队列满时数据包会被丢弃。
        b. 接收socket buffer满时数据包被丢弃。
        c. 重负载会导致receive-livelock发生。
     C.  查看硬中断
          cat /proc/interrupts
     D. 查看软中断
         ps axo pid,comm.,util | grep softirq
    
 注:receive-livelock: 在中断驱动系统里,接收中断的优先级高于其它进程,如果数据包到达得太快的话,CPU会花很多时间去处理接收中收,因此没有资源去把到达的数据包传递给应用程序。
 
13.11 Improving interrupt handling 提升中断处理性能
     A. 两种基本技术:
         a. Interrupt coalescing(中断合并):一个中断处理多个帧。
         b. Polling: 用定时中断来处理进程队列。
    B. 在高负载下驱动会自动调整中断处理。
    C. 总结:
        a. 减少CPU服务时间和利用率。
        b. 把receive buffer 调高一些
        c.  低负载时把延时调大一些。
        d.   根据不同特征的数据包采用不同策略来调整吞吐量。
 
13.12 Tuning interrupt handling 调整中断处理
   A. 确定模块参数
        modinfo –p e1000
   B . Update /etc/modprobe.conf
        alias eth0 e1000
        alias eth1 e1000
        options e1000 InterruptThrottleRate=1,3000
 
       0 禁用
       1 动态自动调整
       3 保守取值
       3000 buffer大小,根据流量自动调整。
 
   设备调整相关命令:
       ethtool
       mii-tool
       ip link
      /sbin/ifup-local
    systool 查询内核模块信息,例:systool –avm usbcore
 
13.13 Network sockets 网络套接字
    A.应用程序是通过socket连接到网络栈来进行读写的
    B. Socket API把每个socket(网络连接)当作一个虚拟文件来处理。
       a. 传输数据相当于写文件。
       b. 接收数据相当于读文件。
       c. 关闭网络连接相当于删除文件。
    C. 读和写buffer是用来为应用程序存数据的.
    D. TCP sockets 需要额外的连接处理。
 
13.14 TCP sockets TCP套接字
    A.  TCP 使用三次握手来建立连接,开启三次握手:
       a. Client -------syn packet-----------à Server
       b. Server--------syn-ack-------------àClient
       c. Client--------ack-----------------à Server
    B. 系统结束cocket 连接:
        a.  一端发送fin包
        b.  另一端发送fin-ack包
        c.   如果连接空闲超时后会被关闭
        d.   连接需要用keepalives来保持活动状态
        e.  半关闭连接(wait状态)在没有收到FIN-ACK之前超过默认超时时间的话会被关闭。
 
13.15 Viewing network sockets 查看网络套接字
     A. Passive opens(listeners) 查看已打开的连接(监听状态)
         netstat -tulpn
     B.Active sockets 活动连接端口
         sar –n SOCK
        lsof   - i 查看正在操作的连接
        netstat - tu
    C. All sockets 所有连接端口
        netstat - taupe
    D.Half-closed connections 半关闭连接
       netstat -tapn | grep TIME_WAIT
 
13.16 Tuning TCP socket creation 创建TCP套接字
   A.TCP connection(syn) 重新连接的次数
        net.ipv4.tcp_syn_retries 默认为5次
   B.重新连接队列的长度
     net.ipv4.tcp_max_syn_backlog 默认为1024,超过此值后丢弃
   C.重新使用TCP连接
      net.ipv4.tcp_tw_recycle 默认为0关闭,1打开
 
13.17 Tuning TCP socket keepalive 调整TCP套接字存活时间
   A.连接空闲多长时间开始发送keepalive.
         net.ipv4.tcp_keepalive_time 空闲时间,默认值7200秒
   B.间隔多久探测一次keepalive
       net.ipv4.tcp_keepalive_intvl  间隔时间,默认值75秒
  C.探测多少次
       net.ipv4.tcp_keepalive_probes 探测次数,默认值9次