This is the strangest!
I have a multi-threaded client application written in Python. I use threading to simultaneously load and process pages. I would use the cURL multiroom, except that the bottleneck is certainly the processor (and not bandwidth) in this application, so itโs more efficient to use the thread pool.
I have a 64-bit i7-download 16-gigabyte RAM. Muscular. I run 80 threads listening to Pandora and trolling Stackoverflow and BAM! The parent process sometimes ends with a message
Killed
In other cases, one page (which is Chromeโs own process) will die. In other cases, the entire browser crashes.
If you want to see some code, here is the gist:
Here is the parent process:
def start( ): while True: for url in to_download: queue.put( ( url, uri_id ) ) to_download = [ ] if queue.qsize( ) < BATCH_SIZE: to_download = get_more_urls( BATCH_SIZE ) if threading.activeCount( ) < NUM_THREADS: for thread in threads: if not thread.isAlive( ): print "Respawning..." thread.join( ) threads.remove( thread ) t = ClientThread( queue ) t.start( ) threads.append( t ) time.sleep( 0.5 )
And here is the essence of ClientThread:
class ClientThread( threading.Thread ): def __init__( self, queue ): threading.Thread.__init__( self ) self.queue = queue def run( self ): while True: try: self.url, self.url_id = self.queue.get( ) except: raise SystemExit html = StringIO.StringIO( ) curl = pycurl.Curl( ) curl.setopt( pycurl.URL, self.url ) curl.setopt( pycurl.NOSIGNAL, True ) curl.setopt( pycurl.WRITEFUNCTION, html.write ) curl.close( ) try: curl.perform( ) except pycurl.error, error: errno, errstr = error print errstr curl.close( )
EDIT: Oh, right ... forgot to ask a question ... it should be obvious: why are my processes killed? Does this happen at the OS level? Core level? Is this due to the limitation on the number of open TCP connections that I have? Is this a limit on the number of threads that I can start right away? The output of cat /proc/sys/kernel/threads-max
is 257841
. So ... I do not think that ....
I think I did it ... OK ... I do not have swap space on my disk. Is there a way to create some swap space? I run Fedora 16. There WAS swap ... then I turned on all of my RAM and it disappeared magically. Tailing /var/log/messages
I found this error:
Mar 26 19:54:03 gazelle kernel: [700140.851877] [15961] 500 15961 12455 7292 1 0 0 postgres Mar 26 19:54:03 gazelle kernel: [700140.851880] Out of memory: Kill process 15258 (chrome) score 5 or sacrifice child Mar 26 19:54:03 gazelle kernel: [700140.851883] Killed process 15258 (chrome) total-vm:214744kB, anon-rss:70660kB, file-rss:18956kB Mar 26 19:54:05 gazelle dbus: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)