Manejo de errores: Boto: Restablecimiento de la conexión por Peer

Tengo un script que se descarga desde Amazon S3. Los guiones funcionan el 99.9% del tiempo. Ocasionalmente obtengo el siguiente error (socket.error: [Errno 104] Restablecimiento de la conexión por par). Una vez que reinicie el código el error parece desaparecer. Ya que es difícil recrear el error. Espero que el código copiado a continuación solucione el error. Específicamente, espero que si aparece el error, intentará volver a descargar el archivo. Me pregunto si este código funcionará, y si hay algo más que deba agregar. Creo que un contador de errores podría ser bueno, por lo que si el error sigue apareciendo, eventualmente seguirá adelante. (No estoy seguro de cómo agregar un contador)

files = [#list of files to download] for file in files: for keys in bucket.list(prefix=file): while True: try: keys.get_contents_to_filename() except socket.error: continue break 

Tuve exactamente el mismo problema. Si buscas boto en GitHub, verás, no estamos solos.

También se conoce un problema aceptado: https://github.com/boto/boto/issues/2207

Alcanzar los límites de rendimiento de AWS S3

La verdad es que, como nos acostumbramos tanto al servicio de Boto y AWS S3, hemos olvidado que estos son sistemas realmente distribuidos, que en algunos casos podrían fallar.

Estaba archivando (descargando, descargando, cargando, subiendo) una gran cantidad de archivos (alrededor de 3 años con aproximadamente 15 fonts, cada una con aproximadamente 1440 versiones al día) y utilizando Celery para hacer esto más rápido. Y debo decir que en algún momento recibí estos errores más a menudo, probablemente alcanzando los límites de rendimiento de AWS S3. Estos errores aparecían a menudo en fragmentos (en mi caso, estaba subiendo unos 60 Mbps durante un par de horas).

Entrenamiento de rendimiento S3

Cuando estaba midiendo el rendimiento, estaba “entrenado”. Después de una hora, la capacidad de respuesta de la cubeta S3 se disparó, AWS probablemente detectó una mayor carga y aumentó algunas instancias más que lo servían.

Prueba la última versión estable de boto

Otra cosa es que el boto está intentando reintentar en muchos casos, por lo que muchas de las fallas están ocultas a nuestras llamadas. En algún momento mejoré un poco con la actualización a la última versión estable.

Mi conclusión es:

  • Intenta actualizar al último boto estable.
  • cuando la tasa de error crece, baja la presión
  • Acepte el hecho de que AWS S3 es un servicio distribuido que tiene problemas de rendimiento poco comunes.

En su código, definitivamente recomendaría agregar algo de sueño (al menos 5, pero 30 s me parece bien), de lo contrario, solo está presionando cada vez más a un sistema, lo que podría estar en una situación inestable en este momento.

Bueno, parecía que el time.sleep () trabajó por un tiempo. Pero, ahora que los archivos son más grandes, eso ni siquiera funciona. Parece que necesito reiniciar el bucle para que vuelva a funcionar. Esta modificación parece estar funcionando.

 def download(filesToDownload): temp = [] for sFile in filesToDownload: for keys in bucket.list(prefix='%s' % (sFile)): while True: try: keys.get_contents_to_filename('%s%s' % (downloadRoot,sFile)) temp.append(sFile) except: time.sleep(30) x = set(filesToDownload) - set(temp) download(x) break 

Tuve este problema, y ​​lo que se arregló fue crear un nuevo acceso, ya que el anterior estaba comprometido