zoukankan      html  css  js  c++  java
  • RHCA442学习笔记-Unit13网络性能调整

      
    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次
  • 相关阅读:
    C++日记 OPENGL错误及解决方案
    C++日记 VS编译问题
    OpenGL 自制API 4
    C++日记 宏定义函数
    OpenGL 自制API gluPerspective
    OpenGL 自制API 3
    OpenGL 自制API 2
    OpenGL 自制API 1
    OPENGL入门教程
    c++基础的记录(随笔记录一些基础的东西)
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5635686.html
Copyright © 2011-2022 走看看