免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 7931 | 回复: 43
打印 上一主题 下一主题

讨论一下 nf_conntrack 表的锁 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-17 10:25 |只看该作者 |倒序浏览
代码中整个 conntrack 表就是用一个全局的锁 nf_conntrack_lock, 内核版本是2.6.24。
如果在多核下,按理说会影响并发访问的性能啊

论坛徽章:
0
2 [报告]
发表于 2010-11-17 11:08 |只看该作者
这个锁用的地方很少,影响应该不大

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2010-11-17 11:26 |只看该作者
这个锁用的地方很少,影响应该不大
funix_zjx 发表于 2010-11-17 11:08


整个 conntrack 模块在操作 conntrack 时都需要适用这个所,怎么理解你说的用的地方很少呢

论坛徽章:
0
4 [报告]
发表于 2010-11-17 11:35 |只看该作者
并不是每次操作conntrack的都需要这个锁,你搜索一下代码就知道了。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2010-11-17 11:42 |只看该作者
多谢。

我看了一下代码,基本上 conntrack 的查找、添加和删除都是需要加锁的。

如果有两个并发的删除动作,按照已有的实现方式,肯定是需要先后顺序进行的,对吧。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
6 [报告]
发表于 2010-11-17 11:52 |只看该作者
回复 5# Godbach
应该是。
每当cat /proc/net/ip_conntrack的时候,如果连接过多,那么系统的网络应用会明显变慢。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-11-17 12:13 |只看该作者
应该是。
每当cat /proc/net/ip_conntrack的时候,如果连接过多,那么系统的网络应用会明显变慢。

我当前看的 2.6.24 的内核是使用的读写锁,据说最新的内核又改成了 spinlock。

对了,cat /proc/net/ip_conntrack 这个动作,内核的实现使用 seq_file, 不知道这方面你了解吗。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
8 [报告]
发表于 2010-11-17 12:21 |只看该作者
本帖最后由 瀚海书香 于 2010-11-17 12:29 编辑

回复 7# Godbach
了解。
cat的时候的确有个copy_to_user的过程,但在我感觉慢应该是锁的原因,应该不是seq_file的原因。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2010-11-17 12:29 |只看该作者
这里有有这样一个问题,我现在 2.6.24 的源码中看到在向用户空间输出 conntrack 信息的时候:
  1. static void *ct_seq_start(struct seq_file *seq, loff_t *pos)
  2. {
  3.         read_lock_bh(&nf_conntrack_lock);
  4.         return ct_get_idx(seq, *pos);
  5. }


  6. static void ct_seq_stop(struct seq_file *s, void *v)
  7. {
  8.         read_unlock_bh(&nf_conntrack_lock);
  9. }
复制代码
在 start 和 stop 进行了加锁和解锁,而 seq_read 的实现中是有 copy_to_user 调用的,这个调用有可能引起 sleep。这个 sleep 对读写锁没有影响吧,如果使用 spinlock 的话,内核就会抱怨。

因此,最新内核的 conntrack 在使用 spinlock 作为全局锁之后,其对应的 seq_start 和 seq_stop 实现改变了:
  92static void *ct_seq_start(struct seq_file *seq, loff_t *pos)
  93        __acquires(RCU)
  94{
  95        rcu_read_lock();
  96        return ct_get_idx(seq, *pos);
  97}
  98
  99static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
100{
101        (*pos)++;
102        return ct_get_next(s, v);
103}
104
105static void ct_seq_stop(struct seq_file *s, void *v)
106        __releases(RCU)
107{
108        rcu_read_unlock();
109}

改成使用 rcu 了。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
10 [报告]
发表于 2010-11-17 12:37 |只看该作者
回复 9# Godbach
哦。最新的内核该成这样的了
感觉rwlock就挺好啊。改成spinlock和rcu来实现,效率有什么大的提升吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP