Chinaunix

标题: linux nat 不支持双cpu? [打印本页]

作者: ippen    时间: 2006-05-11 23:47
标题: linux nat 不支持双cpu?
我用linux做nat,服务器是intel的双至强64位的3Gcpu,内存1G,软件系统 centos3.6,将流量加上后,用top检测CPU的状态,发现四个内核cpu只用了一个(64位至强CPU有两个内核),即有一个内核是满负载,其他三个完全空闲,但只要将NAT取消,4个cpu就平均分配任务,非常不解,各位老大有何办法?
在网上搜索了一下,可以确认netfilter是支持多CPU的

[ 本帖最后由 ippen 于 2006-5-11 23:48 编辑 ]
作者: platinum    时间: 2006-05-12 00:45
原帖由 ippen 于 2006-5-11 23:47 发表
在网上搜索了一下,可以确认netfilter是支持多CPU的

哪里有提到?我去看一下

作者: ippen    时间: 2006-05-12 07:03
http://lists.netfilter.org/piper ... 02-June/008198.html
作者: platinum    时间: 2006-05-12 08:06
http://www.google.com/url?sa=t&a ... k9-me4iP_UrHnndC-xg
作者: 独孤九贱    时间: 2006-05-12 08:56
原帖由 platinum 于 2006-5-12 00:45 发表

哪里有提到?我去看一下


至少Netfilter代码上边是支持的……
没有亲自试过

看了你贴的那篇文章,很有参考价值,只是可惜没有看到作者测试的是哪个版本的,也不知到目前的内核/Netfilter有没有改进……

但是从作者的实验当中来看,Netfilter肯定是支持多处理器的,楼主是不是哪儿没有配置好啊……呵呵

[ 本帖最后由 独孤九贱 于 2006-5-12 09:09 编辑 ]
作者: ippen    时间: 2006-05-12 09:51
多谢白金老大!
从文章结论看,单cpu比双cpu要好 ,真是郁闷,我的双cpu机子白买了
to 九贱兄:
你建议要调整哪些地方?我将系统装好后,只做了简单的一些调整---- 参数 ip_conntrack_max,route/max_size,kernel/shmmax,kernel/shmall
作者: ippen    时间: 2006-05-12 09:55
贴个top状态,可以看见第四个cpu是满负载,其他空闲,cpu会轮换----过一段时间后会变为第一个cpu满负载

09:55:02  up 20:06,  1 user,  load average: 0.99, 0.95, 0.83
33 processes: 31 sleeping, 2 running, 0 zombie, 0 stopped
CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle
           total    0.0%    0.0%    0.0%   0.0%    25.3%    0.0%   74.6%
           cpu00    0.1%    0.0%    0.0%   0.0%     0.0%    0.0%   99.8%
           cpu01    0.0%    0.0%    0.0%   0.0%     0.3%    0.0%   99.6%
           cpu02    0.0%    0.0%    0.0%   0.0%     1.0%    0.0%   99.0%
           cpu03    0.0%    0.0%    0.0%   0.0%   100.0%    0.0%    0.0%
Mem:  1009404k av,  451252k used,  558152k free,       0k shrd,    1312k buff
        20976k active,               6428k inactive
Swap:       0k av,       0k used,       0k free                   23980k cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
作者: platinum    时间: 2006-05-12 10:23

wc -l /proc/net/ip_conntrack
iptables-save
贴一下两个结果
你的网络带宽多大,大概有多少个用户?

作者: ippen    时间: 2006-05-12 11:05
# Generated by iptables-save v1.2.8 on Fri May 12 10:54:35 2006
*nat
REROUTING ACCEPT [3073422:457854968]
OSTROUTING ACCEPT [2305671:391634389]
:OUTPUT ACCEPT [78:12168]
-A POSTROUTING -o eth1 -p tcp -m tcp --dport 25 -j RETURN
-A POSTROUTING -o eth1 -p udp -m udp --dport 25 -j RETURN
-A POSTROUTING -o eth1 -p tcp -m tcp --dport 110 -j RETURN
-A POSTROUTING -o eth1 -p udp -m udp --dport 110 -j RETURN
-A POSTROUTING -o eth1 -p tcp -m tcp --sport 25 -j RETURN
-A POSTROUTING -o eth1 -p udp -m udp --sport 25 -j RETURN
-A POSTROUTING -o eth1 -p tcp -m tcp --sport 110 -j RETURN
-A POSTROUTING -o eth1 -p udp -m udp --sport 110 -j RETURN
-A POSTROUTING -o eth1 -p tcp -m tcp --sport 80 -j RETURN
-A POSTROUTING -s 211.156.xxx.xxx -o eth1 -j RETURN
-A POSTROUTING -d 210.17.209.0/255.255.255.0 -o eth1 -j RETURN
-A POSTROUTING -d 202.106.168.0/255.255.255.0 -o eth1 -j RETURN
-A POSTROUTING -d 202.108.44.0/255.255.255.0 -o eth1 -j RETURN
-A POSTROUTING -d 61.135.159.0/255.255.255.0 -o eth1 -j RETURN
-A POSTROUTING -d 219.142.91.0/255.255.255.0 -o eth1 -j RETURN
-A POSTROUTING -d 203.166.128.137 -o eth1 -j RETURN
-A POSTROUTING -s 211.156.xxx.xxx/255.255.240.0 -o eth1 -j SNAT --to-source 221.xxx.xxx.xxx-221.xxx.xxx.xxx
-A POSTROUTING -s 210.xxx.xxx.xxx/255.255.192.0 -o eth1 -j SNAT --to-source 221.xxx.xxx.xxx-221.xxx.xxx.xxx
-A POSTROUTING -s 61.xxx.xxx.xxx/255.255.192.0 -o eth1 -j SNAT --to-source 221.xxx.xxx.xxx-221.xxx.xxx.xxx
-A POSTROUTING -s 125.xxx.xxx.xxx/255.255.0.0 -o eth1 -j SNAT --to-source 221.xxx.xxx.xxx-221.xxx.xxx.xxx
COMMIT
# Completed on Fri May 12 10:54:35 2006

wc -l /proc/net/ip_conntrack

121382

这个数在高峰时到190000


网路带宽峰值大约在150M,用户数不太好统计,因为nat是为了解决到网通速度的问题,无法确认有多少用户访问网通
作者: platinum    时间: 2006-05-12 11:08

策略有问题,你应该在 filter 表的 FORWARD 链做处理
因为,如果你在 POSTROUTING 链做处理的话,所有数据包都要先经过 Linux 的路由机制,从而导致了性能下降
另外,你应该减少 tcp 的 established 时间,缩短其在连接追踪表中的残留时间
如果方便的话,我能登录到你的服务器看一下比较好

作者: ippen    时间: 2006-05-12 11:10
方才发现更怪的问题,运行了/etc/init.d/iptables restart后,cpu的状态好了

11:12:44  up 21:23,  1 user,  load average: 0.00, 0.02, 0.14
33 processes: 32 sleeping, 1 running, 0 zombie, 0 stopped
CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle
           total    0.0%    0.0%    0.0%   0.1%    27.6%    0.0%   72.2%
           cpu00    0.0%    0.0%    0.0%   0.2%    29.2%    0.0%   70.5%
           cpu01    0.0%    0.0%    0.0%   0.2%    26.6%    0.0%   73.1%
           cpu02    0.0%    0.0%    0.0%   0.0%    26.6%    0.0%   73.3%
           cpu03    0.0%    0.0%    0.0%   0.2%    28.0%    0.0%   71.7%
Mem:  1009404k av,  152464k used,  856940k free,       0k shrd,    1316k buff
        21144k active,               6604k inactive
Swap:       0k av,       0k used,       0k free                   24416k cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
作者: platinum    时间: 2006-05-12 11:12

晕,竟然自动 CPU 分担了?!

作者: ippen    时间: 2006-05-12 11:18
前面的RETURN是有些协议不能NAT,我网内是公网地址,对邮件等协议是不能nat的,如果放再filter表,最终经过POSTROUTING 时做了NAT,会影响用户的邮件服务器
tcp 的 established时间在centos3.6里没法调,迟些自己编译一个新的内核试一下
作者: platinum    时间: 2006-05-12 11:23
原帖由 ippen 于 2006-5-12 11:18 发表
前面的RETURN是有些协议不能NAT,我网内是公网地址,对邮件等协议是不能nat的,如果放再filter表,最终经过POSTROUTING 时做了NAT,会影响用户的邮件服务器
tcp 的 established时间在centos3.6里没法调,迟些自己 ...

FORWARD 的优先级在 POSTROUTING 前面
若 FORWARD 那里已经 DROP 了,数据包不会路由到 POSTROUTING 那里

作者: ippen    时间: 2006-05-12 11:23
原帖由 platinum 于 2006-5-12 11:12 发表

晕,竟然自动 CPU 分担了?!

是呀,搞了一宿竟然是这样结果
继续观察中----不知什么时候又出问题呢
作者: ippen    时间: 2006-05-12 11:28
原帖由 platinum 于 2006-5-12 11:23 发表

FORWARD 的优先级在 POSTROUTING 前面
若 FORWARD 那里已经 DROP 了,数据包不会路由到 POSTROUTING 那里

问题是我要让数据包通过,而不是DROP
作者: platinum    时间: 2006-05-12 11:57
原帖由 ippen 于 2006-5-12 11:28 发表

问题是我要让数据包通过,而不是DROP

我没看出 -j RETURN 在你的规则里的用途,因为我没有发现有子链
或许是你的规则没贴全,或许是你用错了

作者: ippen    时间: 2006-05-12 13:13
画个图容易明白些

          chinanet                                   cnc  
               |                                      |
   +-----------+------------+             +-----------+-----------+
   |        Router1         |             |        Router2        |
   +-----------+------------+             +-----------------------+
               |                                      |  
               |                                      |
   +-----------+------------+   cnc网段   +-----------------------+
   |        Router3         |------------>|      Nat Server       |
   +-----------+------------+             +-----------------------+
               |
               |
   +------------------------+
   |       用户......       |
   +------------------------+       

route2 和 nat server是为了解决用户访问网通速度慢的问题,但是用户中有邮件服务器等应用,如果网通的用户访问我的用户的邮件服务器,回应的数据包被router3指向Nat Server,如果这个数据包被nat后,ip地址变更了,网络连接就会有问题,所以邮件的端口的数据不能DROP,也不能做NAT,只能用RETURN让数据包通过,ACCEPT也不行,ACCEPT规则通过后仍然会跑到下面的NAT规则里的。至于其他的RETURN规则是应用户要求不做nat

作者: ippen    时间: 2006-05-12 13:24
系统又变成只用一个cpu工作了,看样子是内核有些问题
作者: platinum    时间: 2006-05-12 13:33

我想不明白的是,为何 DROP 和 ACCEPT 都不能满足你的需求,唯有 RETURN 可以?
RETURN 是返回上一层链,你的“上一个”是什么呢?
你的 POSTROUTING 已经是 top 链了,若再 RETURN,只会交给 default policy,而你的 default 是 ACCEPT,因此你这里设计有问题
不知道你的 Linux 是不是上图中的 NAT Server,我认为你们的网络有问题,出在 routing、nat 的处理上面,因为不知道详细的网络拓扑和其他相关设备的设置,所以我也说不好是哪里的问题,但设计绝对 100% 存在问题,因为就 iptables 的用法上可以判断,用的不对,而实际根据我以往的经验,是不没必要这样做的,因为如果设计好了,不会出现这样的问题(比如你上面说的“回应的数据包被router3指向Nat Server,如果这个数据包被nat后,ip地址变更了,网络连接就会有问题”)

作者: ippen    时间: 2006-05-12 13:42
找了个不是办法的办法:
参考白金提供的资料,做 irq affinity 静态捆绑
将eth0 和cpu3、cpu4做静态捆绑,eth1 和 cpu0、cpu1做静态捆绑
cpu负载均衡好些,但eth1绑定的CPU还是不均衡,eth1上做了nat,可见的确是netfilter对smp的支持不好
参考资料:http://bcr2.uwaterloo.ca/~brecht/servers/apic/SMP-affinity.txt

13:36:22  up 23:47,  1 user,  load average: 0.99, 0.97, 0.91
33 processes: 31 sleeping, 2 running, 0 zombie, 0 stopped
CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle
           total    0.0%    0.0%    0.0%   0.1%    45.0%    0.0%   54.7%
           cpu00    0.2%    0.0%    0.2%   0.0%     1.2%    0.0%   98.3%
           cpu01    0.0%    0.0%    0.0%   0.0%   100.0%    0.0%    0.0%
           cpu02    0.0%    0.0%    0.0%   0.0%    22.2%    0.0%   77.7%
           cpu03    0.0%    0.0%    0.0%   0.4%    56.4%    0.0%   43.2%
Mem:  1009404k av,  198512k used,  810892k free,       0k shrd,    1316k buff
        21136k active,               6604k inactive
Swap:       0k av,       0k used,       0k free                   24420k cached

[ 本帖最后由 ippen 于 2006-5-12 14:09 编辑 ]
作者: ippen    时间: 2006-05-12 13:53
我对 RETURN的理解和你的不一样,在一个表中,如果一个数据包匹配RETURN的条件,就表示这个数据包返回上一层,不再尝试匹配RETURN后面的规则,也就是说退出当前表的匹配,但如果用ACCEPT的话,就表示如果这个规则通过后,仍然尝试匹配ACCEPT后面的规则,所以使用ACCEPT和RETURN产生的效果并不一样

在POSTROUTING中RETURN表示退出POSTROUTING链的规则匹配,继续匹配下一个表

[ 本帖最后由 ippen 于 2006-5-12 14:00 编辑 ]
作者: platinum    时间: 2006-05-12 14:12
原帖由 ippen 于 2006-5-12 13:53 发表
我对 RETURN的理解和你的不一样,在一个表中,如果一个数据包匹配RETURN的条件,就表示这个数据包返回上一层,不再尝试匹配RETURN后面的规则,也就是说退出当前表的匹配,但如果用ACCEPT的话,就表示如果这个规则通过后,仍然尝试匹配ACCEPT后面的规则,所以使用ACCEPT和RETURN产生的效果并不一样

但如果你看 netfilter 源码的话,会发现有几个基本处理动作
include/linux/netfilter.h

  1. /* Responses from hook functions. */
  2. #define NF_DROP 0
  3. #define NF_ACCEPT 1
  4. #define NF_STOLEN 2
  5. #define NF_QUEUE 3
  6. #define NF_REPEAT 4
  7. #define NF_STOP 5
复制代码

RETURN 那个 target 实际只是把控制交给上一层,相当于把指针(链表)转到别的地方,转走以后具体如何处理,还是看你的处理动作(是上面的哪种)
我做了一个试验

  1. service iptables stop;iptables -A INPUT -p tcp --dport 23 -j RETURN
复制代码

从 client 去 telnet,通过 Ethereal 抓包发现,有 3 个 SYN,还有 3 个 RST,ACK
接着,我写了一句

  1. iptables -P INPUT DROP
复制代码

再次 telnet,发现只有 3 次 SYN,没有任何回包,因此我的结论是正确的,数据没有到内核网络协议栈,没有被 RST 回来,因此你的结论是错的
针对“对某些网站不要使用透明代理”的做法,也是通过
  1. iptables -t nat -I PREROUTING -d IP -p tcp --dport 80 -j ACCEPT
复制代码
实现的,因此,你的做法不对,存在理解的问题

packet1.png (6.99 KB, 下载次数: 76)

packet1.png

packet2.png (4.39 KB, 下载次数: 75)

packet2.png

作者: springwind426    时间: 2006-05-12 14:22
原帖由 ippen 于 2006-5-12 13:13 发表
画个图容易明白些

          chinanet                                   cnc  
               |                                      |
   +-----------+------------+             +------ ...



对于这种情况,你应该做策略路由(在router3中)

ip route add default via chinanet的网关 dev chinanet的接口 table 100

ip rule add 需要提供服务的内网IP table 100

这样,所有的访问控制在forward链(这儿只做访控)和nat表的postrouting链(这儿只做地址转换)中做控制,这样的话控制规则比较好写,也清晰一些。
作者: ippen    时间: 2006-05-12 14:24
翻了一下iptables的手册,应该说两人的理解都没有错误,只是在具体应用上对RETURN用法的理解并不太相同
作者: platinum    时间: 2006-05-12 14:27
原帖由 ippen 于 2006-5-12 14:24 发表
翻了一下iptables的手册,应该说两人的理解都没有错误,只是在具体应用上对RETURN用法的理解并不太相同

ACCEPT 就是让数据包逃离本 hook 点,RETURN 是逃离本链到上一层逻辑链去处理(默认规则也算上一层逻辑链),现在你明白了吗?

作者: ippen    时间: 2006-05-12 14:27
原帖由 springwind426 于 2006-5-12 14:22 发表



对于这种情况,你应该做策略路由(在router3中)

ip route add default via chinanet的网关 dev chinanet的接口 table 100

ip rule add 需要提供服务的内网IP table 100

这样,所有的访问控制在fo ...


电信出口是3*GE,不可能这样做,内网实际上都是211.xxx.xxx.xxx的公网地址,不是经过DNAT进来的
作者: ippen    时间: 2006-05-12 14:31
原帖由 platinum 于 2006-5-12 14:27 发表

ACCEPT 就是让数据包逃离本 hook 点,RETURN 是逃离本链到上一层逻辑链去处理(默认规则也算上一层逻辑链),现在你明白了吗?


这点的理解大家完全一样,至于我的RETURN用法,也是没有问题,具体回头再解释,我现在要外出办事
作者: platinum    时间: 2006-05-12 14:37
原帖由 ippen 于 2006-5-12 14:31 发表
这点的理解大家完全一样,至于我的RETURN用法,也是没有问题,具体回头再解释,我现在要外出办事

你用了 RETURN 实际和 ACCEPT 没区别,在你的规则里,RETURN 只是交给 default policy 去 ACCPET 而已,和直接使用 ACCEPT 没什么不同,且效率低下,但不知为何你却说 ACCEPT 不行
能解释的都解释了,不说了,如果说的不对敬请拍砖


[ 本帖最后由 platinum 于 2006-5-12 14:57 编辑 ]
作者: cxsztl    时间: 2006-05-12 16:08
我也有同感,虽然用了smp_affinity,但是效果不明显。
作者: ippen    时间: 2006-05-12 18:25
原帖由 platinum 于 2006-5-12 14:37 发表

你用了 RETURN 实际和 ACCEPT 没区别,在你的规则里,RETURN 只是交给 default policy 去 ACCPET 而已,和直接使用 ACCEPT 没什么不同,且效率低下,但不知为何你却说 ACCEPT 不行
能解释的都解 ...

自己搭了个环境测试了一下,白金老大说的对,RETURN 和 ACCEPT 的确是一样的......
我用RETURN的原由肯定是以前的某个linux版本用ACCEPT不行,而用RETURN就可以,所以一直沿用到现在....可能是rh9.0or7.2
作者: platinum    时间: 2006-05-12 19:10
原帖由 ippen 于 2006-5-12 18:25 发表

自己搭了个环境测试了一下,白金老大说的对,RETURN 和 ACCEPT 的确是一样的......
我用RETURN的原由肯定是以前的某个linux版本用ACCEPT不行,而用RETURN就可以,所以一直沿用到现在....可能是rh9.0or7.2

RETURN 未必就是 ACCEPT,他只是转到上一层逻辑链处理
是 ACCEPT 还是 DROP 还是 DNAT 还是 SNAT 要看上一层如何处理的
因为你的 POSTROUTING 是 TOP 链,所以 RETURN 后由 POSTROUTING 的默认规则决定
因为你的 POSTROUTING 的默认规则是 ACCEPT,所以最后就是 ACCEPT 了

我用RETURN的原由肯定是以前的某个linux版本用ACCEPT不行,而用RETURN就可以,所以一直沿用到现在....可能是rh9.0or7.2
有可能,iptables 和 netfilter 都在升级,都在变化,但是有些细节的改变并未 CHANGELOG 中提到,所以难免大家会有误会

作者: zbhdpx    时间: 2006-05-14 14:03
从前看到后边,厉害!!!
作者: adrh123    时间: 2006-05-16 10:16
至少加上flags
你的iptables有好多东西都没有加,多看看tcp/ip的知识

iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j xxx
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j xxx
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST
.......
iptables -A FORWARD -p tcp --tcp-flags FIN,RST FIN,RST -j xxx
......
作者: JohnBull    时间: 2006-05-16 14:03
SMP不适合I/O密集型的任务。
作者: ippen    时间: 2006-05-16 16:59
原帖由 adrh123 于 2006-5-16 10:16 发表
至少加上flags
你的iptables有好多东西都没有加,多看看tcp/ip的知识

iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j xxx
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j xxx
iptables  ...

呵呵,我不需要考虑安全的问题,只需要一个高速的nat,这个是根据具体应用环境而定的,和TCP/IP的知识多少无关吧?
作者: ippen    时间: 2006-05-16 17:00
原帖由 JohnBull 于 2006-5-16 14:03 发表
SMP不适合I/O密集型的任务。

是否就是说在NAT的环境中使用SMP的机器不如使用单cpu的机器?
作者: platinum    时间: 2006-05-16 17:03
我认为准确来说,应该是使用 SMP 内核不如使用 UP 内核
作者: ippen    时间: 2006-05-16 17:26
明天编译个UP的内核试试
另,请教白金,2.4 or 2.6 的内核,你认为那个的NAT效率更高些,或者推荐一个内核版本给我试试,我这里有比较好的测试环境,测试结果可以提供给大家参考
作者: platinum    时间: 2006-05-16 17:35
原帖由 ippen 于 2006-5-16 17:26 发表
明天编译个UP的内核试试
另,请教白金,2.4 or 2.6 的内核,你认为那个的NAT效率更高些,或者推荐一个内核版本给我试试,我这里有比较好的测试环境,测试结果可以提供给大家参考

据有关资料显示,2.6 的性能要比 2.4 的好,我没测试过 ^_^

2.4.31
2.6.15.7
可以对比测试一下

2.6.16.x 改了不少东西,有些 OS 的 script 还与之不能兼容,不过有兴趣可以测试一下性能,估计比 2.6.15 要高

[ 本帖最后由 platinum 于 2006-5-16 17:37 编辑 ]
作者: JohnBull    时间: 2006-05-16 23:10
原帖由 ippen 于 2006-5-16 17:00 发表

是否就是说在NAT的环境中使用SMP的机器不如使用单cpu的机器?


也不能定论,SMP引入了并行性的同时也代来了很多互斥问题。
如果不同CPU频繁访问全局资源,效率很可能还不如UP。
在NAT网关这个问题里,状态表就是一个全局资源,网络接口也是全局资源,对于状态表而言,SMP能带来多少好处要取决于实现。而网络接口就根本无法从SMP处得益了。
决定用不用SMP之前要搞清楚Linux的这部分实现,并分析出你的瓶颈在哪。
作者: ippen    时间: 2006-05-17 09:55
在对系统状态的检测看来,并不是netfilter对smp不支持,NAT进程启动时,系统是能将任务自动分担到各个CPU中,过了一段时间后,就变成只用一个cpu工作了,而这个时间并不固定,有时10分钟,有时12小时,似乎是某个特定的条件触发导致的。只要你将iptables stop,再重新启动,又是多cpu并行工作。多cpu并行工作时,系统的负载能力的确是比较高;尝试过smp_affinity,但效果不明显,流量甚至一直缓慢下降,参考 platinum 和johnbull 的意见,应该是单cpu更适合于NAT的应用环境,现在正在重新编译内核,迟些将测试结果告诉各位。
作者: dy810810    时间: 2006-05-18 09:07
严重关注。
作者: cxsztl    时间: 2006-05-19 08:36
ding!
作者: creat7151    时间: 2006-05-19 13:09
收益非浅。
作者: 痞菜    时间: 2006-05-21 02:48
可以试试  redhat as4 看看是否可以正常使用。SMP还是很奇怪的跟内核有很大关系。我觉得可能是netfilter和内核有些兼容性的问题。理论上SMP对netfilter不会有多大帮助。问题在于状态表的控制权上,操作系统很难判断。为啥出现有时可以自动分配实在是说不上来。感觉和内核关系最大。
作者: 痞菜    时间: 2006-05-21 02:52
对了 “双至强64位的3Gcpu”   好像问题就出在这里。  建议用2.6.13 以后的内核因为以前的内核对64位和smp支持的都不好。as4 内核是2.6.9 估计可以满足部分要求。
作者: zhyf810    时间: 2006-05-24 13:19
高手呀,都是!!!!
作者: ippen    时间: 2006-05-25 09:30
大家一定都等急了吧?
先告诉大家2.4.31内核nat测试结果,测试的结果有些意外,虽然platinum 和johnbull 提供的信息表明smp不如up,但测试结果看来,smp的负载能力较up的内核高,这个和具体环境有关系,系统有个程序叫irqbalance,其作用是将irq中断平均分配各多个CPU,作用和smp_affinity类似,启动后,明显看到IRQ中断分配给两个不同的CPU,因而我的两张网卡的数据处理分别由两个CPU分配,因而负载能力比UP高
测试中,如果用up内核,早上10:00左右cpu就到了100%,一直到晚上1:00左右才降下来;用smp内核,负责nat的网卡的cpu最高到82%,负责内网网卡的cpu最高在56%,余下的两颗CPU一直100%空闲(我的机器是双CPU双核,所以总共4个CPU)
结论:虽然smp对netfilter支持不好,但如果你有两张网卡的话,双cpu和smp系统对系统负载能有提高,但如果是单网卡的话,smp就没有意义了,三张以上网卡和更多的CPU是否能有更高的性能?尚未测试,个人认为有系统性能会更高
2.6的内核仍然测试中,2.6up内核编译有错,nat无法加载,要下周才有结果了

[ 本帖最后由 ippen 于 2006-5-25 09:35 编辑 ]
作者: platinum    时间: 2006-05-25 10:21
根据文档显示,修改 smp_affinity 可以实现同网卡的 I/O 均匀分布在多个逻辑 CPU 上,但我实验没有成功,包括 2.4 和 2.6 内核都试过了,不过文档贴出来的操作截图却可以,让我很诧异

没错,RH 有个程序叫 irqbalance,用于分配多个设备的 I/O 到多个逻辑 CPU 上,如果不启用 irqbalance,大家都挤用一个逻辑 CPU,启用以后会“各行其道”,但并没有达到文档中说的修改 smp_affinity 后的作用,如果支持了这个功能,那就牛了。。。

另外说一句,2.6 内核不要使用 2.6.16.x,netfilter 部分有了很大改动,废弃了一些之前的框架,所以与现有的系统(比如 AS4、CentOS 4.x)不兼容,建议使用 2.6.15.1x
作者: ippen    时间: 2006-05-25 11:03
2.6.16.x在编译后使用时一直出错,总是出现neighber table overflow ,所以没有进行测试
irqbalance 只能将一个网卡绑定在一个cpu上,不能绑在两个cpu上,因为在我的系统上明显看出绑定NAT的那张网卡的cpu负载高一截,这点和smp_affinity 有点不同,至于将一个网卡绑定在两个CPU上,应该要网卡的驱动程序支持才行,我的主板是se7520bd2,在intel的网站上看到一个描述,就是板载的marvell的驱动支持多个cpu分布处理,按这个描述,一切东西都要支持SMP才ok,只是marvell在开始造成主机系统崩溃,所以没敢继续用,另外添加了一张intel e1000 pci-x的卡。
作者: ippen    时间: 2006-05-29 09:28
2.6kernel的测试结果
kernel 2.6 的测试结果比2.4要好,正如白金说的,2.6的内核比2.4内核效率高,而且在测试结果看来,2.6内核在nerfilter上的效率比2.4要高约20%,在承载相同流量的情况下,up核心cpu利用率最高82%,明显比2.4要好多了。
可是2.6的内核出现一个错误,其间cpu会全速处理一些任务,会导致瞬间的流量中断,错误信息是
warning: many lost ticks.
Your time source seems to be instable or some driver is hogging interupts
rip run_timer_softirq+0x164/0x1bb
我在多个2.6内核版本中都发现过这个问题,2.4的版本就没有发现这个问题,在网上搜索了一下,似乎和acpi有关,但将acpi进程关闭也无效,大家能否提供些有用的信息?
作者: showrun    时间: 2006-05-30 20:58
关注中,收获很大
作者: Andsun    时间: 2006-06-01 18:05
真对性很强,学习中~~~~


支持继续交流
作者: bluespray    时间: 2006-06-04 11:03
我的服务器也是双至强CPU,只有一个CPU负载很大,其它几乎都没有负载,请问怎么通过irqbalance 将一个网卡绑定在一个cpu上?
作者: platinum    时间: 2006-06-04 11:11
原帖由 bluespray 于 2006-6-4 11:03 发表
我的服务器也是双至强CPU,只有一个CPU负载很大,其它几乎都没有负载,请问怎么通过irqbalance 将一个网卡绑定在一个cpu上?

只能将不同网卡绑定到不同的逻辑 CPU 上,单网卡分担到不同的逻辑 CPU 上我没有试验成功,虽然文档上说可以
作者: ippen    时间: 2006-06-04 18:58
原帖由 bluespray 于 2006-6-4 11:03 发表
我的服务器也是双至强CPU,只有一个CPU负载很大,其它几乎都没有负载,请问怎么通过irqbalance 将一个网卡绑定在一个cpu上?

没有什么特别设置,启动irqbalance就可以,服务器上必须有两张网卡,一张接内网,一张接外网,否则没有作用
作者: bluespray    时间: 2006-06-04 22:21
我的服务器系统是redhat 9我编译内核使用了2.6.14,但是没有安装irqbalance,哪儿有安装包,在网上找了一圈都没有找到!服务器配了四个网卡,因为是双至强,显示是四个逻辑CPU,如果每个网卡绑定一个,应该效果不错吧,目前只用了一个,使用率70%,其他三个负载很小!
作者: ippen    时间: 2006-06-04 22:35
redhat 9 已经是一个很老的版本了,建议更换为centos4.3,irqbanlance是内核自带的工具,好像是在kernel-utils的包里,可以上mirror.be10.com上面找找看
作者: bluespray    时间: 2006-06-04 22:55
我在编译内核2.6.14-7的时候选择了"
[*]  Enable kernel irq balancing  "
但是怎么启动它呢?好象找不到!
作者: ippen    时间: 2006-06-04 23:21
要安装工具才能用,运行后有个irqbanlance的程序在运行的
作者: liyanux    时间: 2006-06-06 16:34
关注中,学到了很多东西。
作者: louiezhu    时间: 2006-06-28 16:58
我也碰到了在2.4内核的时候只有一个cpu跑流量的情况,2.6的我没试过,但我觉得既然2.6开始支持了irq balance,那么这种情况2.6就不会出现……
"Local APICs before P4 by default arbitrated for interrupt handling, via a
round robin type scheme, this doesn't seem to be the case with P4 since the
Arbitration ID register is also gone now.
        Zwane"
牛人的话,说的是p4的平台,没有硬件自动分担中断的机制(可能是为了中断亲和性的考虑,交给操作系统来分担),所以中断触发一直是在cpu0上的,一般的数据包处理都是中断之后交给tasklet来处理的,而tasklet的实现又是只能在调用schedule的cpu上来再次调用,所以后续处理都是在同一个cpu上,包括netfilter

2.6加了irqbalance,好像就是为了这种平台考虑的,如果开了irqbalance,我觉得就应该没这个问题了,lz是不是有些东西没启用啊
作者: ippen    时间: 2006-06-29 13:41
原帖由 louiezhu 于 2006-6-28 16:58 发表
我也碰到了在2.4内核的时候只有一个cpu跑流量的情况,2.6的我没试过,但我觉得既然2.6开始支持了irq balance,那么这种情况2.6就不会出现……
"Local APICs before P4 by default arbitrated for interrupt ...

2.4和2.6都有irqbalance,而且都有效,但都不能分摊NAT的任务,只能分别处理不同的网卡;就是说,如果有两张网卡,那就是有两个cpu分别为这两个网卡工作,其他CPU是基本空闲的。irqbalance好像没有任何设置的地方,只是运行及可以了,我找不到还有哪些地方需要启动的:p

就目前而言,我已经将NAT优化得比较好了,一颗cpu的机子最高nat承载260m,cpu大约在16%左右,已经基本能满足我的应用要求了。迟些有空再写个NAT服务器优化总结。
作者: platinum    时间: 2006-06-29 13:51
原帖由 ippen 于 2006-6-29 13:41 发表
就目前而言,我已经将NAT优化得比较好了,一颗cpu的机子最高nat承载260m,cpu大约在16%左右,已经基本能满足我的应用要求了。迟些有空再写个NAT服务器优化总结。

期待 ^_^
作者: 在风中飘荡    时间: 2007-05-29 23:49
原帖由 ippen 于 2006-6-29 13:41 发表于 64楼  

2.4和2.6都有irqbalance,而且都有效,但都不能分摊NAT的任务,只能分别处理不同的网卡;就是说,如果有两张网卡,那就是有两个cpu分别为这两个网卡工作,其他CPU是基本空闲的。irqbalance好像没有任何设置的 ...

期待lz大作。
作者: shdnzwy    时间: 2007-05-30 15:54

作者: sisi8408    时间: 2007-05-30 16:08
2.4和2.6都有irqbalance,而且都有效,但都不能分摊NAT的任务,只能分别处理不同的网卡;就是说,如果有两张网卡,那就是有两个cpu分别为这两个网卡工作,其他CPU是基本空闲的。irqbalance好像没有任何设置的地方,只是运行及可以了,我找不到还有哪些地方需要启动的:p


其他CPU是基本空闲的, 这是大实话~~
可以让它忙起来,代码都写好了,想让jack测测,
不知死哪去了,郁闷~~~~~~

问 LZ:
您的4核机器,让俺玩3天?

[ 本帖最后由 sisi8408 于 2007-5-30 16:30 编辑 ]
作者: sisi8408    时间: 2007-05-30 16:18
参考 platinum 和johnbull 的意见,应该是单cpu更适合于NAT的应用环境,现在正在重新编译内核,迟些将测试结果告诉各位


这是歪理,小心 R. Russell划着木筏子找你打官司,呵呵。
作者: 思一克    时间: 2007-05-30 16:44
你找到/boot/System.map文件,(uname -a )看版本,

grep physical_balance 看有无。

CONFIG_IRQBALANCE=y 应该 有
作者: 思一克    时间: 2007-06-29 10:44
cat /proc/interrupts的结果可以贴出来吗
作者: shdnzwy    时间: 2007-06-30 22:15
高人……不知楼主总结出炉了没有?
作者: 思一克    时间: 2007-07-12 16:13
我在LINUX 2。13 SMP已经做好了将一块网卡的IRQ在2个CPU之间平衡切换,多个CPU也一样,找最少的那个使用。多个网卡也应该可以。

改动的是文件arch/i386/kernel/io_apic.c.

不用用户空间的irqbalance,
实际上, 如果你有2个NIC, 2个CPU,现有程序也可以分担到2个CPU,不过切换周期很长。

虽然可以分配,但是
网络负载无法直接利用SMP。同一个时刻, 一个NIC中断还是在一个CPU运行。但SMP还是应该快,因为另一个NIC现在没有使用的CPU可以负责用户程序。间接地提高了速度。

我实验好了后会将对io_apic.c的改动贴出来。
作者: tom_xx_hu@yahoo    时间: 2007-07-13 05:48
好帖。尤其处理意见分歧有大家风范。我可惜去年还没来,今年才看到,要感谢几位今年顶了此帖。
这么打包收藏才好呢?
不顶不平心头之好!
作者: ippen    时间: 2007-07-13 10:35
原帖由 sisi8408 于 2007-5-30 16:08 发表


其他CPU是基本空闲的, 这是大实话~~
可以让它忙起来,代码都写好了,想让jack测测,
不知死哪去了,郁闷~~~~~~

问 LZ:
您的4核机器,让俺玩3天?

to:sisi8408      想试试解决双核机器nat的问题?

4核的机器在用,双核的行吗?有兴趣的话联系我,ippen@21cn.com

你找到/boot/System.map文件,(uname -a )看版本,

grep physical_balance 看有无。

CONFIG_IRQBALANCE=y 应该 有


to: 思一克 在/boot/System.map中没有找到CONFIG_IRQBALANCE=y,我现在用的centos4.3,之前在测试时曾经编译2.6.15的内核做实验,专门将irqblance选上的,不过测试的效果不理想,所以最终放弃了。


之前事情很多,也少了上chinaunix,最近有点时间,会将我做NAT的经验总结一下,给各位作参考,希望给大家提供些帮助。
作者: 思一克    时间: 2007-07-13 14:30
我已经给出了patch. 欢迎测试。

http://linux.chinaunix.net/bbs/v ... page%3D1#pid6369549
作者: ippen    时间: 2007-07-13 15:52
佩服思老大的专业精神,不过现在那台4核的机器用作其他用途了,只有双核的机器了,下周测试一下再将结果贴上来。
作者: 思一克    时间: 2007-07-13 16:43
那个补丁的算法还需要完善(喂鸡问题):

N个小鸡(n1,n2,...nN)。
M个人(m1,m2,...mM)。

人随机地不定期喂食他们,每次只喂一米粒喂一个小鸡。可以连续给同一个鸡。
求算法,控制Mx什么时候喂Nx,
使得N个小鸡吃的平均, 越来越平均。

当人数小于等于鸡数时,不允许多个人同时喂一个鸡。
作者: sisi8408    时间: 2007-07-13 21:50
同一个时刻, 一个NIC中断还是在一个CPU运行。

可以让多个处理器参与一个中断的处理
但SMP还是应该快,因为另一个NIC现在没有使用的CPU可以负责用户程序。
间接地提高了速度。

这个间接,可能直接被中断屏蔽了,如watchdog触发的宕机。
作者: sisi8408    时间: 2007-07-13 21:55
to:sisi8408      想试试解决双核机器nat的问题?

4核的机器在用,双核的行吗?有兴趣的话联系我,ippen@21cn.com

过两天把麻烦撇清了,把代码贴出来,让大家测,和改进。
btw, 正是你贴的结果刺激俺写了代码,
当时俺看了结果很震惊,想了约40分钟,随一气下来,
再改了一版,基本好了。

[ 本帖最后由 sisi8408 于 2007-7-13 22:04 编辑 ]
作者: 思一克    时间: 2007-07-13 22:15
4核的也一样能平衡.
作者: wheel    时间: 2007-07-19 10:02
Legends used in the results :-

cfs        = base cfs performance (sched-cfs-v2.6.22-rc4-mm2-v16.patch)
cfscc      = base cfs + patches 1-3 applied (core changes to cfs core)
cfsccrt    = base cfs + patches 1-4 applied (fix RT/NORMAL interactions)
cfsgrpch   = base cfs + patches 1-5 applied (group changes applied)
cfsgrpchdi = base cfs + all patches applied (CONFIG_FAIR_GROUP_SCHED disabled)
cfsgrpchen = base cfs + all patches applied (CONFIG_FAIR_GROUP_SCHED enabled)


1. lat_ctx (from lmbench):
==========================

Context switching - times in microseconds - smaller is better

-------------------------------------------------------------------------
Host                  OS  2p/0K 2p/16K 2p/64K 8p/16K 8p/64K 16p/16K 16p/64K
                          ctxsw  ctxsw  ctxsw ctxsw  ctxsw   ctxsw ctxsw
---------  ------------- ------ ------ ------ ------ ------ ------- -------

cfs        Linux 2.6.22- 6.2060 7.1200 7.7746 7.6880  11.27 8.61400 20.68
cfscc      Linux 2.6.22- 6.3920 6.9800 7.9320 8.5420  12.1  9.64000 20.46
cfsccrt    Linux 2.6.22- 6.5280 7.1600 7.7640 7.9340  11.35 9.34000 20.34
cfsgrpch   Linux 2.6.22- 6.9400 7.3080 8.0620 8.5660  12.24 9.29200 21.04
cfsgrpchdi Linux 2.6.22- 6.7966 7.4033 8.1833 8.8166  11.76 9.53667 20.33
cfsgrpchen Linux 2.6.22- 7.3366 7.7666 7.9    8.8766  12.06 9.31337 21.03


Performance of CFS with all patches applied (but with CONFIG_FAIR_GROUP_SCHED
disabled) [cfsgrpchdi above] seems to be very close to base cfs
performance [cfs above] (delta within tolerable noise level limits?)


2. hackbench
============

hackbench -pipe 10:

cfs             0.787
cfscc           0.7547
cfsccrt         0.9014
cfsgrpch        0.8691
cfsgrpchdi      0.7864
cfsgrpchen      0.9229

hackbench -pipe 100:

cfs             3.726
cfscc           3.7216
cfsccrt         3.8151
cfsgrpch        3.6107
cfsgrpchdi      3.8468
cfsgrpchen      4.2332

3. Fairness result between users 'vatsa' and 'guest':

        The two groups were created as below in container filesystem:
        
        # mkdir /dev/cpuctl
        # mount -t container -ocpuctl none /dev/cpuctl
        # cd /dev/cpuctl
        # mkdir vatsa
        # mkdir guest
        
        # echo vatsa_shell_pid > vatsa/tasks
        # echo guest_shell_pid > guest/tasks

        # # Start tests now in the two user's shells

hackbench -pipe 10:

        vatsa : 1.0186
        guest : 1.0449

hackbench -pipe 100:

        vatsa : 6.9512
        guest : 7.5668
作者: skylove    时间: 2007-09-03 23:53
好帖子,正好现在可能会用到,感谢各位前辈的经验分享
作者: daizhongxian    时间: 2007-09-07 10:09
学到不少东西啊  支持交流
作者: star0395    时间: 2007-09-08 21:18
收获颇多!收益非浅呀!
作者: shdnzwy    时间: 2007-09-08 22:23
学习了,有些还看不太懂,努力中……
作者: luo118    时间: 2008-08-20 18:09
我剛剛也偶到這問題了,
作者: druggo    时间: 2008-09-01 15:36
学习一下,目前我还只有单网卡在用
作者: Au_Hank    时间: 2008-10-20 19:29
真是好贴子, 学习了好多知识. 尤其是关于LZ的设计方案, 白金关于IPTABLE 的分析还有各位大老对IRQ的分析...

思一克班竹的那个喂小鸡的问题, 可不可以这样解决呢?

把每只小鸡(CPU)编号1-n, 系统维护一个当前应该被喂的小鸡号码X(循环), 每次要喂小鸡的时候(中断), 都要排他地取得这个号码, 让这个号码++, 并且给小鸡喂食.这样无论有多少人喂, 小鸡吃的都是相同的.

对内核编程没有很好的经验, 期望能够得到指正
作者: freemeditator    时间: 2008-10-21 09:48
似乎好复杂哦`
什么东西
作者: wheel    时间: 2009-06-22 18:27
echo 00000000,000000ff >  /proc/irq/2297/smp_affinity
echo 00000000,000000ff >  /proc/irq/2298/smp_affinity
作者: qianguozheng    时间: 2011-05-15 13:53
学习了
作者: b508431b    时间: 2011-10-09 18:07
俺弱弱的说一句.这是数据密集型的.cpu要求没那么高吧?
作者: platinum    时间: 2011-10-09 19:02
俺弱弱的说一句.这是数据密集型的.cpu要求没那么高吧?
b508431b 发表于 2011-10-09 18:07

为啥数据密集型不需要 CPU?
作者: b508431b    时间: 2011-10-10 13:39
回复 94# platinum
DMA....这个比cpucopy快多了.....至少快10倍吧.
作者: platinum    时间: 2011-10-10 16:58
回复  platinum
DMA....这个比cpucopy快多了.....至少快10倍吧.
b508431b 发表于 2011-10-10 13:39


nat 需要修改数据包内容,重新计算校验和
这个 DMA 也能完成吗?
作者: flyzxt    时间: 2012-11-02 14:44
这个问题经过长时间的研究。我发现不是CPU也不是IPTABLES的问题。是网卡的问题。 有空的时候大家查一下网卡的 软中断队列支持多少,就好了。


cat /proc/interrupts  | grep eth




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2