Optimizing sockets to 1000 requests/sec? (Was: Sockets and messaging services)

Gordon McMillan gmcm at hypernet.com
Thu Nov 15 08:09:02 EST 2001


Stephen wrote:

[Gordon]
>> About 3 years ago, I wrote a Python message-slinger as a drop-in
>> replacement for my client's C code. It did around 600 msgs / sec (vs
>> <200 / sec for the client's code). That was Python 1.4 on 3 year old
>> hardware. 
> 
> Thanks for the example, Gordon. Gives me the confidence knowing that
> "it is possible" ~ now I just have to work out how. It's very
> reassuring, rather than having doubts and asking myself "should I 
> be doing this directly in C/Java instead?" whenever I hit a problem.  
> 
>> So 1000 / sec is quite possible, but you'll never get there with
>> blocking sockets. 
> 
> Even if they're threaded ?  

Even if they're threaded. Thread creation is high-overhead (allocating megs 
of memory, for one thing). If you do use threads, it's better to create a 
thread pool and reuse them. Depends on platform, but if you're using more 
than (say) a dozen threads, you're probably wasting resources. It's also 
vastly more efficient to use select than to have the OS cycle through a 
bunch of context-switches, testing for socket activity. 

Basically, the "one thread per socket" model sucks.
 
> May I ask what you used for the 600 msgs/sec ? Select's and asyncore ?

It was very similar to asyncore.
 
- Gordon



More information about the Python-list mailing list