qianguozheng 发表于 2016-03-15 11:11

linux kernel实现http proxy功能

最近在想办法提升http proxy到性能, 发现在路由器设备上, 每秒平均请求经过代理相较于不经过代理会下降70%。测试过tinyproxy, privoxy, squid, 结果类似。
也找过相关论文看, 说是在kernel-level拷贝数据到application-level这样要经过4次,会导致性能下降,还有说select调用过多system call会导致CPU消耗过高。


所以我想是否可以在内核曾实现http proxy功能, 将需要处理到数据共享内存给应用层程序? 应用层对内容进行修改再由内核曾发送出去, 不知道这种思路是否可行?
小弟对tcp/ip协议栈没有那么熟悉, 还是烦请各位帮忙看看,有相关经验到分享下, 谢谢。

jerryhua_cu 发表于 2016-03-15 17:31

提供两个思路
1、纯用户态,使用DPDK等技术,利用零拷贝直接在应用层处理proxy功能;缺点是需要自己实现或者移植用户态协议栈
2、纯内核态,利用netfilter hook截获数据包进行处理,缺点,降低内核的稳定性,容易把系统搞崩溃。

Godbach 发表于 2016-03-15 17:38

回复 1# qianguozheng

在标准 kernel 里面实现 http proxy 就是纯属折腾。作为一个 demo 演示可以,生产环境用起来各种问题。


   

Godbach 发表于 2016-03-15 17:39

回复 1# qianguozheng

二楼介绍的 DPDK 应该是一个不错的解决方案。


   

nswcfd 发表于 2016-03-16 11:59

dpdk的user space stack目前有哪些开源的方案可供参考?

lwip?

qianguozheng 发表于 2016-03-31 11:28

回复 2# jerryhua_cu


    感谢回复, 经过测试发现问题在防火墙上有syn_flood限制, 导致我们到请求进入路由应用层到数据限制在平局25个请求。

    至于大神介绍到DPDK我得仔细学习下,看看性能如何

Godbach 发表于 2016-03-31 19:45

回复 6# qianguozheng

DPDK 是纯收发报文的,性能肯定没问题。

但是最大的问题是,他没有 TCP/IP 协议栈。你要用 DPDK,就要自己实现这一套逻辑。而且当前,应该没有开源出来比较好用的基于 DPDK 的协议栈。


   

Godbach 发表于 2016-03-31 19:58

回复 1# qianguozheng

所以呢,当前要是搞个 DPI 之类的,简单的报文分析,DPDK 还是不错的。如果你要玩 TCP,甚至 HTTP,那么用 DPDK 难度还是很大的。


   

帅绝人寰 发表于 2016-04-02 14:50

Godbach 发表于 2016-03-31 19:58 static/image/common/back.gif
回复 1# qianguozheng

所以呢,当前要是搞个 DPI 之类的,简单的报文分析,DPDK 还是不错的。如果你要玩 ...

没有配套的协议栈的话,这玩意儿只能用来做个control plane了?

Godbach 发表于 2016-04-04 16:29

回复 9# 帅绝人寰

应该是 data plane 吧。

要不要配套协议栈,关键看你要用它做什么。一些简单 DPI 的功能,应该用不上复杂的协议栈,只要自己能够维持一个 session table 就行了。snort 就是这样的例子。


   
页: [1] 2
查看完整版本: linux kernel实现http proxy功能