Showing posts with label network. Show all posts
Showing posts with label network. Show all posts

Thursday, May 10, 2012

[Linux]优化网卡性能

参考
Tuning 10Gb network cards on Linux
Setting IRQ Affinity for Red Hat Summit 10G Ethernet Tuning
1 设定网卡IRQ affinity.
设置IRQ affinity就是将同一设备的IRQ绑定到同一个(组)CPU上.
比如你可以通过mpstat这个命令来查看当前CPU处理IRQ的分配. 比如查看所有CPU, 每隔5秒刷新一次:
$ mpstat -P ALL 5
如果要改变某个IRQ的CPU affinity, 可以通过写相关IRQ/proc/irq/路径来实现. 比如
$ echo 80 > /proc/irq/177/smp_affinity
这个命令将IRQ 177的affinity掩码改为0x80
一个实例:
eth5为一个10G网卡,所以系统会对这块网卡产生N个TxRx队列,N为core数目.所以我当前机器上有24个core,所以有24个队列.我希望将每个队列的mask均为0x00ffffff,也就是所有的core都可能处理eth5产生的IRQ.有时候我们希望讲同一个设备的IRQ绑定在同一个(组)core上,从而提高cache的性能. 这里附上一个寻找并显示某个网卡设备(比如eth0, eth5)相关的IRQ以及其smp_affinity mask的脚本
#!/usr/bin/python

import os
import sys 

names = []

args = sys.argv[1:]
while args:
    names.append(args[0])
    args = args[1:]

for dir_name in os.listdir('/proc/irq/'):
    if not os.path.isdir('/proc/irq/%s' % dir_name):
        continue
    for file_name in os.listdir('/proc/irq/%s' % dir_name):
        found = False
        for idx, name in enumerate(names):
            if file_name.startswith(name):
                found = True
        if not found: continue
        path = '/proc/irq/%s/smp_affinity' % dir_name
        print path, file_name
        print 'mask = %s' % (open(path).read().strip())
        break
运行这个脚本:
$ sudo ./get_smp_affinity.py eth5
/proc/irq/127/smp_affinity eth5:lsc
mask = 00ffffff
/proc/irq/126/smp_affinity eth5-TxRx-23
mask = 00ffffff
...
...
/proc/irq/103/smp_affinity eth5-TxRx-0
mask = 00ffffff
这里我还有一篇post介绍如何在C当中设定CPU affinity.[Linux]使用C设置线程的CPU affinity. 在一个试验中, 我用如上方法把一个24-core的CPU中core0到core5设定为处理10Gb网卡的IRQ, 而把我的程序线程绑定在core6以上,从而取得了最大的throughput.

2 Ethernet Interrupt coalescing
这篇"Interrupt coalescing"解释了什么是Interrupt coalescing. ethtool 是用来显示以及修改网卡的设定的工具. ethtool -c选项可以用来显示网卡的Interrupt coalescing参数. 比如要显示eth0的参数:
sudo ethtool -c eth0
Coalesce parameters for eth0:
Adaptive RX: off  TX: off
stats-block-usecs: 999936
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0

rx-usecs: 18
rx-frames: 12
rx-usecs-irq: 18
rx-frames-irq: 2

tx-usecs: 80
tx-frames: 20
tx-usecs-irq: 18
tx-frames-irq: 2

rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0

rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
参数解释
rx-usecs和rx-frames控制每一个RX DMA channel的RX interrupt速率. 每当累计接收到rx-frames这么多个,或者rx-usecs这么长时间过后, 一个RX interrupt就会被产生. 对于low latency要求的application, 尽量将rx-usecs设置小. 而对于bulk traffic, 设置大.
rx-frames-irq 控制最多一个RX interrupt可以处理多少个RX packets
将eth0的rx queue的timer设为1000 us
sudo ethtool -C eth0 rx-usecs 1000

3 TCP/UDP parameter tuning
(待续...)

Wednesday, April 06, 2011

[Linux]Ubuntu下网络设置

配置网卡IP地址

1 修改/etc/network/interfaces 设置各个网卡地址(DHCP或者静态)
比如下面将第一块以太网卡(eth0)设为DHCP
# The primary network interface
auto eth0
iface eth0 inet dhcp
或者静态绑定IP地址
auto eth0  
iface eth0 inet static  
address 192.168.0.103  
gateway 192.168.0.1  
netmask 255.255.255.0
2 重启网络使新设置生效
/etc/init.d/networking restart


设置DNS

修改/etc/resolv.conf设置DNS服务器的地址. 比如我的DNS服务器为10.212.3.3
nameserver 10.212.3.3
domain apc999.net
search apc999.net


配置SSH Server

1 安装openssh-server
$apt-get install openssh-server
2 修改/etc/ssh/ssh_config可以设置诸如端口(默认是22)等设置.
3 重启ssh server
$sudo /etc/init.d/ssh restart


配置DHCP Server

http://www.ubuntugeek.com/how-to-install-and-configure-dhcp-server-in-ubuntu-server.html
1 安装dhcp3-server
$apt-get install dhcp3-server
2 设置dhcp server
$sudo vi /etc/default/dhcp3-server
把INTERFACES=""改成INTERFACES="eth0" (假设你是要在eth0上做dhcp server)
$sudo vi /etc/dhcp3/dhcpd.conf
根据具体要求做修改
3 重启dhcp3-server
$sudo /etc/init.d/dhcp3-server restart


配置DNS Server

http://ubuntuforums.org/showthread.php?t=236093
可以选择bind9
1 安装dns server
$sudo apt-get install bind9
也可以选择dnsmasq. dnsmasq是一个轻量级的dns/dhcp/tftp server


配置NFS Server

1 安装NFS server
$apt-get install nfs-kernel-server
2 修改/etc/exports
比如要把/share目录共享给192.168.1.0这个网络,增加如下行
/share       192.168.1.0/24(rw,fsid=0,insecure,no_subtree_check,async)
3 重启NFS server
$sudo /etc/init.d/nfs-kernel-server restart


配置tftp Server

http://www.davidsudjiman.info/2006/03/27/installing-and-setting-tftpd-in-ubuntu/
tftp是trivial file transfer protocol的缩写. tftp比ftp功能弱.但是因为简单,常用于net boot 等应用上.tftp-hpa是一个加强版的tftpd
1 安装tftp-hpa
$apt-get install tftp-hpa
2 tftp可以使用xinetd, 所以我们修改/etc/xinetd.d/tftp,让它看起来差不多如下:
service tftp
{
        disable                 = no
        socket_type             = dgram
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -v -s /var/lib/tftpboot
        only_from   = 192.168.0.0/24
        interface   = 192.168.0.1
}
这里我们的tftpd面向192.168.0这个网络,tftp的共享目录在/var/lib/tftpboot. 注意user要在设定的目录中有权限, 不然会有问题.
3 重启tftpd-hpa(通过重启xinetd)
sudo /etc/init.d/xinetd start


PXE Boot Server

PXE Boot使得一台机器的BIOS通过请求一个TFTP服务器来得到一个可以boot的linux image --- 就像你在这台机器上插入了一个CD来boot一样.
1 设置TFTP Server,
2 设置DHCP Server
3 创建或修改/var/lib/tftpboot/pxelinux.cfg/default, 这个文件用来设定PXE启动使用默认使用的Linux 镜像. 比如我的设定是:
LABEL linux
KERNEL vmlinuz-2.6.32-21-server
APPEND root=/dev/nfs initrd=initrd.img-2.6.32-21-server nfsroot=10.103.0.1:/nfsroot boot=nfs ip=dhcp rw --
注意你需要把initrd.img-2.6.32-21-server和vmlinuz-2.6.32-21-server这两个文件放在/var/lib/tftpboot底下.这样使用PXE启动的机器就可以通过tftp来下载Linux内核镜像来启动.


配置iptables实现NAT

(如果是Ubuntu用户可以使用ufw(Uncomplicated Firewall)来配置iptables)
https://help.ubuntu.com/10.04/serverguide/C/firewall.html
http://www.howtoforge.com/nat_iptables

设置IP FORWARDing and Masquerading
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT
如果希望每次启动的时候都加载这些iptables设定, 先把这些rules存到一个文件中(比如IP_FORWARDING):
iptables-save > /etc/IP_FORWARDING
然后修改/etc/network/interfaces
auto eth0
iface eth0 inet dhcp
 pre-up iptables-restore < /etc/IP_FORWARDING
让kernel选择packet forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
也可以修改/etc/sysctl.conf使得默认的ip_forward为1.
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
重要命令
ifup ifdown ifconfig hostname设置主机名称, 比如
$hostname   #显示当前主机名称
$sudo hostname foo  #设定当前主机名称为foo
参考:
Setting up Network Interfaces Debian Network Setup ubuntu 10.10 Network config