您的位置:首页 > 理论基础 > 计算机网络

RH442-11 网络调优之一

2011-09-05 17:27 363 查看
网络调优

一、概述
1. 重要的网络调优
l 应用队列的技术来优化带宽
l 调整TCP和UDP的带宽
2. 简化传输模型
l 数据包的传输类似于写文件与发文件
l 数据以"file"的形式写入到buffer中,内核在将这些数据封装在PDU(protocol data units)中,PDU在将数据转移到设备的传输页面中(队列)。
l 网卡驱动程序将PDU拷贝到网卡中,网卡增加中断,传输开始。
l buffer大小设置成多少较为合适?传输队列(transmit queue)的大小设置为大少较为合适?这些参数取决与传输的数据量和带宽的延时。
3. 简化接受模型
l 接受数据包,网卡接受架构(frame),同时使用DMA(直接内存访问,DMA是操作系统分配给相关硬件的特定内存,用于接受传输信息)将信息拷贝到receive buffer。
l 网卡增加CUP的中断。内核会处理中断,并且调用softirq(中断分为硬中断和软中断,其中硬中断与硬件有关,而软中断与CUPsize有关)
l softirq负责将数据包转移到IP和路由层

二、Kernel socket buffers
1. Kernel buffers
l UDP:core的读写buffers
l TCP:core的读写buffers+TCP的读写buffers
l 碎片的buffer
l DMA for nic receive
2. 内核会自动根据流量来调buffers
l buffers要求是free memory,非页表里的内存。
l buffers属于zone_normal的一部分,会增加zone_normal的压力
l 接收流量控制是基于接收buffer的大小来决定的
3. 计算buffer size的大小
l buffer size的大小要根据BDP(带宽延时的乘积)来确定。buffers size是指一次网络传输的数据量。
l socket buffer = BDP / #sockets(接口数)
Lpipe (BDP)= Bandwidth * DelayRtt = A * W
例:带宽:100MiB(比特位),计算时要乘以 1/8(兆),最后还要乘以2的20次方(字节)延时:3s(3000MS),延时量DelayRtt是使用ping命令所测试出的结果
BDP = 100MiB/s x 3s x 1/8 x 220Bytes= 39321600 Bytes
socket buffer = BDP / #sockets=39321600 Bytes/1=39321600 Bytes

[root@station9 ~]# ping 192.168.32.221
PING 192.168.32.221 (192.168.32.221) 56(84) bytes of data.
64 bytes from 192.168.32.221: icmp_seq=1 ttl=64 time=0.228 ms
64 bytes from 192.168.32.221: icmp_seq=2 ttl=64 time=0.225 ms
--- 192.168.32.221 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.225/0.226/0.228/0.015 ms
#DelayRtt取avg值,0.226ms

4. All connections share pipe
l socket buffer=BDP / #sockets #如果有3网口,则#sockets=3。buffers size是指一次网络传输的数据量。如果距离越远(延时越大),则一次网络传输的数据量也应该相应增大,以优化网络传输。
l 并发数越大则buffers size 应该越小,并发数越小buffers size 应该越大
Max connections =>min buffer Lmax=Lpipe/Min connections
Min connections =>max buffer Lmin=Lpipe/Max connections

三、Tuning core buffer size
调整core buffer size,该buffer针对与非TCP的连接,如UDP。
1. update /etc/sysctl.conf for BDP/#connections
l input/reader in bytes:
[root@station9 ~]# sysctl -a|grep net.core|grep rmem
net.core.rmem_default = 110592 #默认发送的buffer大小

net.core.rmem_max = 131071 #最大接收buffer大小=BDP

l output/writer in bytes
[root@station9 ~]# sysctl -a|grep net.core|grep wmem
net.core.wmem_default = 110592 #默认发送的buffer大小
net.core.wmem_max = 131071 #最大接收buffer大小=BDP

四、调整TCP buffers size的大小
1. Tuning core buffer size (同上)
2. 调整TCP buffers size的大小
[root@station9 ~]# sysctl -a|grep tcp|grep --color mem
net.ipv4.tcp_rmem = 4096 87380 4194304
#reader buffers 发送(bytes)
net.ipv4.tcp_wmem = 4096 16384 4194304
#write buffers 接受(bytes)
net.ipv4.tcp_mem = 98304 131072 196608
#overall TCP memory整体的页面数(pages)
#以上三个参数都有相应的最小、默认、最大值。最大值是默认值的1.5倍。kernel将会自动调整buffers size的大小,但是调整的范围必须人为配置。
3. 实例:
网络环境1.5M带宽,500ms延时,现要求调最小和默认的值为bdp大小,最大不能超过bdp的1.5倍
BDP=1.5*0.5/8*1024*1024=98304 bytes
则设置应该如下(注意单位):
net.ipv4.tcp_rmem = 98304 98304 147456(=98304*1.5 )
net.ipv4.tcp_wmem = 98304 98304 147456
net.ipv4.tcp_mem = 24(=98304/4096) 24 36(=24*1.5)
#测试实验时需安装模拟网卡的程序包,rpm -ivh bdp-lab-0.1-01.noarch.rpm。

五、调整DMA buffer size的大小
1. 要求NIC有可调DMA buffer功能。DMA:直接内存访问,内存本来是通过内核调用的,现在直接通过硬件调用。系统会分配16MB的内存给DMA使用。
l 查看DMA的信息:modinfo –p e1000
l 更新/etc/modprobe.conf
alias eth0 e1000
options eth0 RxDescriptors=1024 TxDescriptors=512 #设置发送和接收buffer尺寸
# etc/modprobe.conf,该文件用于调整设备的参数。当计算机加载模块时,系统会自动加载所需的配置文件。但从企业版6开始,系统已经没有/etc/modprobe.conf文件。
2. For TCP connetions
increase socket buffer size by 25%。

3. 调mod模块的参数实例,如调st(磁带机)的DMA buffer大小
l 查询st详细情况
[root@station2 ~]# modinfo st
filename: /lib/modules/2.6.18-194.el5/kernel/drivers/scsi/st.ko
alias: char-major-9-*
license: GPL
description: SCSI tape (st) driver
author: Kai Makisara
srcversion: AA839FAA66A7758BC7A5C9D
depends: scsi_mod
vermagic: 2.6.18-194.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
parm: buffer_kbs:Default driver buffer size for fixed block mode (KB; 32) (int)
parm: max_sg_segs:Maximum number of scatter/gather segments to use (256) (int)
parm: try_direct_io:Try direct I/O between user buffer and tape drive (1) (int)
parm: try_rdio:Try direct read i/o when possible (int)
parm: try_wdio:Try direct write i/o when possible (int)
module_sig: 883f3504ba037561e1fa4939f6a62931121de10a0848d4d981dbbdbae7c66db42146a66fc62b878d0a0b6e060ea3e8bf9288fc0f8b72f899139dd98acc

[root@station2 ~]# cat /sys/bus/scsi/drivers/st/fixed_buffer_size
32768 #st的buffer大小为:32Kbytes

l 加载st模块,修改st的DMA buffer大小为128kbytes
[root@station2 ~]# vim /etc/modprobe.conf
alias scsi_hostadapter ata_piix
alias scsi_hostadapter1 virtio_blk
alias eth0 virtio_net
options st buffer_kbs=128
[root@station2 ~]#modprobe -r st #卸载st模块
[root@station2 ~]#modprobe st #加载st模块
[root@station2 ~]# cat /sys/bus/scsi/drivers/st/fixed_buffer_size
131072 #st的DMA buffer大小已经被调整为:128Kbytes
#下次开机自动生效,需配置/etc/rc.d/rc.local文件,其中添加modprobe st
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息