最近某同学的有个程序跑得好慢,疑似有点问题。程序的核心是读取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);
pcap_close(fp);
pcap_close(fp);
位置
这里在packet_handler发现了问题,他把对包的解析功能写在了里面,这是比较复杂的一个过程,合理的方式应该是在这里只做一件事,把包放到队列里,然后结束,另外开多线程去处理包。
问题定位到。ok