Saltar al contenido

Uso de memoria lambda de AWS con archivos temporales en código python

Haz todo lo posible por entender el código correctamente antes de adaptarlo a tu trabajo y si tquieres aportar algo puedes compartirlo con nosotros.

Solución:

Actualizar

Nota: Para responder a esta pregunta, usé Lambdash, aunque tuve que modificar la versión lambda que se usa para node8.10. Lambdash es una pequeña biblioteca simple que puede usar para ejecutar comandos de shell en una lambda desde su terminal local.

El directorio / tmp en AWS Lambdas se monta como un dispositivo de bucle. Puede verificar esto (después de seguir las instrucciones de configuración para lambdash), ejecutando el siguiente comando:

./lambdash df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G  4.0G   26G  14% /
/dev/loop0      526M  872K  514M   1% /tmp
/dev/loop1      6.5M  6.5M     0 100% /var/task

Según https://unix.stackexchange.com/questions/278647/overhead-of-using-loop-mounted-images-under-linux,

los datos a los que se accede a través del dispositivo de bucle tienen que pasar por dos capas del sistema de archivos, cada una con su propio almacenamiento en caché para que los datos terminen en caché dos veces, desperdiciando mucha memoria (el infame problema de la “doble caché”)

Sin embargo, mi conjetura es que /tmp se guarda en la memoria. Para probar esto, ejecuté los siguientes comandos:

./lambdash df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G  4.0G   26G  14% /
/dev/loop0      526M  1.9M  513M   1% /tmp
/dev/loop1      6.5M  6.5M     0 100% /var/task

./lambdash dd if=/dev/zero of=/tmp/file.txt count=409600 bs=1024
409600+0 records in
409600+0 records out
419430400 bytes (419 MB) copied, 1.39277 s, 301 MB/s

./lambdash df -h
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/xvda1       30G  4.8G   25G  17% /
 /dev/loop2      526M  401M  114M  78% /tmp
 /dev/loop3      6.5M  6.5M     0 100% /var/task

./lambdash df -h
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/xvda1       30G  4.8G   25G  17% /
 /dev/loop2      526M  401M  114M  78% /tmp
 /dev/loop3      6.5M  6.5M     0 100% /var/task

Tenga en cuenta que cada vez que lo ejecuté, se ejecutó el lambda. A continuación se muestra el resultado de los registros de Cloudwatch de Lambda:

07:06:30 START RequestId: 4143f502-14a6-11e9-bce4-eff8b92bf218 Versión: $ LATEST 07:06:30 END RequestId: 4143f502-14a6-11e9-bce4-eff8b92bf218 07:06:30 REPORT RequestId: 4143f502-14a6- 11e9-bce4-eff8b92bf218 Duración: 3.60 ms Duración facturada: 100 ms Tamaño de memoria: 1536 MB Memoria máxima utilizada: 30 MB

07:06:32 START RequestId: 429eca30-14a6-11e9-9b0b-edfabd15c79f Versión: $ LATEST 07:06:34 END RequestId: 429eca30-14a6-11e9-9b0b-edfabd15c79f 07:06:34 REPORT RequestId: 429eca30-14a6- 11e9-9b0b-edfabd15c79f Duración: 1396.29 ms Duración facturada: 1400 ms Tamaño de memoria: 1536 MB Memoria máxima utilizada: 430 MB

07:06:36 START RequestId: 44a03f03-14a6-11e9-83cf-f375e336ed87 Versión: $ LATEST 07:06:36 END RequestId: 44a03f03-14a6-11e9-83cf-f375e336ed87 07:06:36 REPORT RequestId: 44a03f03 11e9-83cf-f375e336ed87 Duración: 3.69 ms Duración facturada: 100 ms Tamaño de memoria: 1536 MB Memoria máxima utilizada: 431 MB

07:06:38 START RequestId: 4606381a-14a6-11e9-a32d-2956620824ab Versión: $ ÚLTIMA 07:06:38 END RequestId: 4606381a-14a6-11e9-a32d-2956620824ab 07:06:38 REPORT RequestId: 4606381a-14a6- 11e9-a32d-2956620824ab Duración: 3.63 ms Duración facturada: 100 ms Tamaño de memoria: 1536 MB Memoria máxima utilizada: 431 MB

¿Qué pasó y qué significa esto?

La lambda se ejecutó 4 veces. En la primera ejecución, mostré dispositivos montados. En la segunda ejecución, llené un archivo en el /tmp directorio, utilizando 401Mb de los 500Mb permitidos. En las ejecuciones posteriores, enumeré los dispositivos montados, mostrando su espacio disponible.

La utilización de memoria en la primera ejecución fue de 30 Mb. La utilización de la memoria para las ejecuciones posteriores estuvo en el rango de 400Mb.

Esto confirma que /tmp de hecho, la utilización contribuye a la utilización de la memoria.

Respuesta original

Supongo que lo que está observando es python, o el contenedor lambda en sí, almacenando el archivo en la memoria durante las operaciones de escritura.

Según https://docs.python.org/3/library/functions.html#open,

el almacenamiento en búfer es un número entero opcional que se utiliza para establecer la política de almacenamiento en búfer. Pase 0 para desactivar el almacenamiento en búfer (solo se permite en modo binario), 1 para seleccionar el almacenamiento en búfer de línea (solo se puede usar en modo de texto) y un número entero> 1 para indicar el tamaño en bytes de un búfer de fragmentos de tamaño fijo. Cuando no se proporciona ningún argumento de almacenamiento en búfer, la política de almacenamiento en búfer predeterminada funciona de la siguiente manera:

Los archivos binarios se almacenan en el búfer en fragmentos de tamaño fijo; el tamaño del búfer se elige mediante una heurística que intenta determinar el “tamaño de bloque” del dispositivo subyacente y recurre a io.DEFAULT_BUFFER_SIZE. En muchos sistemas, el búfer suele tener una longitud de 4096 u 8192 bytes. Los archivos de texto “interactivos” (archivos para los que isatty () devuelve True) usan búfer de línea. Otros archivos de texto utilizan la política descrita anteriormente para archivos binarios.

El tempfile.TemporaryFile() la función tiene un parámetro de palabra clave, buffering, que básicamente se pasa directamente a la open llamada descrita anteriormente.

Entonces mi conjetura es que el tempfile.TemporaryFile() la función utiliza el valor predeterminado open() ajuste de almacenamiento en búfer de la función. Podrías intentar algo como tempfile.TemporaryFile(buffering=0) para deshabilitar el almacenamiento en búfer, o tempfile.TemporaryFile(buffering=512) para establecer explícitamente la cantidad máxima de memoria que se utilizará al escribir datos en un archivo.

Uso de /tmp no cuenta para el uso de memoria. El único caso en el que esto podría estar correlacionado es cuando lee el contenido del archivo en la memoria.

Al final de la web puedes encontrar las acotaciones de otros administradores, tú aún puedes dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *