pcap包处理程序的一次改进
?? 最近某同学的有个程序跑得好慢,疑似有点问题。程序的核心是读取pcap数据包,然后白名单过滤插入数据库。在实际使用中发现每秒插入数据库条数在1000条每秒左右,而且是在占用了30个左右的数据库连接情况下,效率有点低。
???? 刚开始我以为是数据库插入部分写得有点问题,这里采用的是逐条insert的方式,我经过查阅资料选择了改进为
insert all into test(a,b,c) values ('a1','a','a') into test(a,b,c) values ('a2','a','a') into test(a,b,c) values ('a3','a','a') into test(a,b,c) values ('a4','a','a') into test(a,b,c) values ('a5','a','a') select * from dual
?
这样子的插入,从理论上来说应该是有较大提高的。
???????
?????? 但是实际中发现速度提升很不明显,我就往前面看,发现白名单过滤这里采用了正则表达式,这是比较耗资源的一个行为,他首先采用了正则表达式来去匹配这是否是个正规的域名,这里我觉得没什么必要删掉了,其次他大量采用了临界区去锁这个资源,我表示理解不能。。。删掉
?
?
???? 然后发现效率有小量提升,但不是特别明显,继续研究。
?
??? 然后到了程序的起始
写道pcap_loop(fp,0,packet_handler,NULL);?位置
?这里在packet_handler发现了问题,他把对包的解析功能写在了里面,这是比较复杂的一个过程,合理的方式应该是在这里只做一件事,把包放到队列里,然后结束,另外开多线程去处理包。
?? 问题定位到。ok