多线程Snort:从简单线程到流固定的性能优化
1. 线程目标与性能分析
在对Snort进行多线程优化时,首先需要确定线程化的目标。线程化目标在调用链中应处于较高位置,明显要高于 _IO_fread_internal()
,因为这些函数位于系统库中。并且,当前花费大量时间的文件I/O函数在生产版本中并不存在,生产版本将从网络获取数据包而非文件。综合考虑,最适合进行线程化的位置是 InterfaceThread()
。
以下是Snort的部分调用时间数据:
| 函数名 | 总时间(微秒) | 自身时间(微秒) |
| — | — | — |
| InterfaceThread | 2,548,405 | 4 |
| Pcap_loop | 2,545,747 | 4 |
| Pcap_offline_read | 2,545,743 | 0 |
| _IO_fread_internal | 2,263,365 | 2,263,365 |
| PcapProcessPacket | 282,552 | 0 |
| Packet_time_update | 0 | 0 |
| Sfthreshold_reset | 0 | 0 |
| ProcessPacket | 282,552 | 0 |
2. 简单线程化Snort
为了进一步加速Snort应用程序,考虑利用系统的多核特性创建多线程版本。使用POSIX线程库(libpthread)实现简单线程化,即让每个线程运行整个Snort代码(不包括初始化和关闭