¡Esto es lo más extraño!El sistema operativo comienza a matar procesos cuando se ejecuta el proceso de python de subprocesos múltiples
Tengo una aplicación de cliente multiproceso escrita en Python. Estoy usando subprocesos para descargar y procesar páginas simultáneamente. Utilizaría el multi-identificador cURL, excepto que el cuello de botella es definitivamente el procesador (no el ancho de banda) en esta aplicación, por lo que es más eficiente usar un grupo de subprocesos.
Tengo un 64b i7 balanceo de 16 GB de RAM. Fornido. ¡Lanzo 80 hilos mientras escucho Pandora y trolleando Stackoverflow y BAM! El proceso padre a veces termina con el mensaje
Killed
Otras veces una página única (que es su propio proceso en Chrome) morirán. Otras veces, el navegador completo se bloquea.
Si quieres ver un poco de código aquí es el quid de la cuestión:
Aquí es el proceso padre:
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)
Y aquí es la esencia de la 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()
EDITAR: Ah, claro ... se olvidó de hacer la pregunta ... debería ser obvio: ¿Por qué mis procesos son asesinados? ¿Está sucediendo en el nivel del sistema operativo? Nivel de kernel? ¿Esto se debe a una limitación en la cantidad de conexiones TCP abiertas que puedo tener? ¿Es un límite en la cantidad de hilos que puedo ejecutar a la vez? La salida de cat /proc/sys/kernel/threads-max
es 257841
. Entonces ... No creo que sea eso ...
Creo que lo tengo ... OK ... No tengo espacio de intercambio en mi disco. ¿Hay alguna manera de crear un espacio de intercambio ahora? Estoy ejecutando Fedora 16. Hubo intercambio ... luego habilité toda mi memoria RAM y desapareció mágicamente. Tizón /var/log/messages
me encontré con este 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)
Compruebe la salida 'dmesg (8)' para ver si el núcleo registraba alguna información. – sarnold
Gracias ... haré ... – KeatsKelleher
las últimas entradas en 'dmesg (8)' pertenecen a mi adaptador wifi que se asocia con mi enrutador. ... que fue hace horas – KeatsKelleher