You make it sound so simple ;-)
Yes, this is definitely doable (I used a machine running 32 concurrent
load-balanced instances to deal with monitoring a 10Gb network)... you
just need to make sure you've got enough RAM and I/O bandwidth to handle
what comes out the other end.
I'd recommending explicitly setting cpu affinity using the 'taskset'
utility if possible. If PF_RING or similar is effective enough at
slicing your traffic into predictably manageable chunks, this goes a
long way to avoiding unnecessary context switching and other
unpleasantries that rob you of your precious compute cycles.
If your network is like mine, where even a robust 5-tuple hash-based
(CRC32/MD5) flow-balancing algorithm will still produce uneven packet
distributions in the face of targeted throughput spikes, you'll need to
account for a bit more CPU horsepower as well. In that situation, I
found it best to disable cpu affinity and let the kernel schedulers
prioritize my snorts as they saw fit. At the cost of some raw
performance, you'll get much smoother handling of bursty traffic that
way because a single overloaded Snort can be rescheduled by the kernel
to consume an entire cpu core on its own until the peak subsides.
Depending on the size and complexity of your ruleset, a good rule of
thumb is about one cpu core / snort instance for about every ~300Mbps
worth of traffic.
Oh, and of course there's the fun problem of managing the coordinated
startup, shutdown, and configuration reloading of 32 snorts on the same
box - never mind throwing in stuff like barnyard2 and friends. I managed
to do this using a single config file and a single on-disk snort
installation and a custom init script with a startup loop. The loop
would increment over my load-balanced virtual network adapters, feeding
appropriate differentiating command-line options to my Snorts as they
started up. Unfortunately that was created as a work for hire, so I'm
not at liberty to share that piece just yet.
Hope that helps!
Regards,
Robert Vineyard