Amazon S3 es uno de los servicios de almacenamiento más utilizados en la nube debido a su escalabilidad, durabilidad y facilidad de uso. Sin embargo, es bien conocido dentro de la comunidad técnica que ciertas operaciones sobre S3, especialmente ListObjects, pueden presentar tiempos de respuesta lentos. En algunos casos extremos, los usuarios han reportado esperar hasta 120 segundos para que esta operación retorne datos. Esta situación plantea preguntas importantes sobre el rendimiento y la gestión adecuada del almacenamiento en S3, principalmente cuando se trabaja con grandes volúmenes de datos y versiones. Para entender por qué ListObjects puede volverse tan lento, es esencial conocer el contexto del versionamiento en S3.
El versionado es una función que permite mantener múltiples versiones de un objeto dentro de un mismo bucket, lo que aporta una capa adicional de seguridad y recuperación ante errores o pérdidas accidentales de datos. Al eliminar un objeto en un bucket con versionado activado, Amazon S3 no elimina realmente el objeto, sino que crea un marcador de eliminación (delete marker). Este marcador es una versión especial que señala que el objeto ha sido eliminado, aunque las versiones anteriores siguen almacenadas en el bucket. El impacto de estos marcadores de eliminación es mayor de lo que podría parecer a simple vista. Cuando se ejecuta ListObjects, S3 tiene que filtrar todos estos marcadores para mostrar únicamente los objetos activos o la versión más reciente que no haya sido eliminada.
Sin embargo, debido a que esos marcadores aún existen en el almacén, el proceso de escaneo se vuelve más costoso en tiempo, ya que hay que recorrer una gran cantidad de versiones, entre las cuales se incluyen los marcadores de eliminación. En situaciones donde el bucket contiene millones o incluso miles de millones de objetos que han sido eliminados pero cuyos marcadores permanecen, ListObjects puede ralentizarse de manera significativa. Esta problemática fue evidenciada en un caso real con la plataforma Databend, un almacén de datos nativo en la nube que utiliza S3 como backend de almacenamiento. Los desarrolladores de Databend notaron que una operación de limpieza o vacuum, que busca eliminar objetos huérfanos no referenciados por los snapshots de las tablas, fallaba debido a que la operación de listado excedía el tiempo límite permitido. Al investigar, descubrieron que esta lentitud se relacionaba directamente con el uso intensivo de marcadores de eliminación en buckets con versionado activo y un número masivo de objetos generados y luego borrados.
Un detalle crucial que contribuye a esta ralentización es el orden lexicográfico en que S3 organiza y lista los objetos. Databend optimiza el almacenamiento generando claves basadas en UUIDs ordenables por tiempo (UUIDv7), lo que permite.listar objetos en un orden cronológico que facilita la gestión de borrados. Sin embargo, aún con esta optimización, si el bucket está saturado de marcadores de eliminación, S3 debe trabajar más para filtrar estos elementos, lo cual afecta el rendimiento de ListObjects. Para ilustrar el problema, se realizaron pruebas comparativas listando un bucket con y sin prefijos específicos.
Se observó que listar todo el bucket donde se habían eliminado millones de archivos tardaba más de medio segundo por operación, mientras que listar con un prefijo particular disminuía el tiempo a menos de 10 milisegundos. Más alarmante fue constatar que en algunas situaciones de inicio en frío, la operación podía demorarse más de 30 segundos, lo que explica el reporte de esperas cercanas a los dos minutos. Este comportamiento puede parecer contradictorio, ya que intuitivamente un bucket vacío debería devolver una respuesta rápida al listar objetos, sin importar el alcance del prefijo consultado. Sin embargo, el peso de los marcadores de eliminación hace que S3 tenga que escanear y filtrar una cantidad abrumadora de versiones obsoletas antes de devolver un resultado limpio. La operación se vuelve entonces un proceso mucho más intensivo de lo esperado.
Amazon reconoce que la activación del versionado en un bucket puede ocasionar degradación en el rendimiento, como se explica en su documentación, aunque no siempre ofrece una explicación detallada del mecanismo detrás de esta situación. El hecho es que los marcadores de eliminación actúan como elementos residuales que persisten, afectando el desempeño hasta que se eliminan manualmente o mediante políticas automatizadas. A raíz de estos descubrimientos, la recomendación más clara para quienes administran buckets en Amazon S3 es activar políticas de ciclo de vida (lifecycle management). Estas políticas permiten configurar reglas automáticas para eliminar marcadores de eliminación y versiones no actuales después de un periodo determinado. De esta forma, se controla la acumulación de estos elementos y se mejora el rendimiento general de operaciones como ListObjects.
Otra recomendación importante es evaluar seriamente la necesidad de mantener habilitado el versionado. Aunque es una función poderosa para la gestión de datos y la recuperación, no es gratuita en términos de costos ni de rendimiento. Sólo debe activarse cuando se justifique por requerimientos específicos de protección y auditoría de objetos. Los desarrolladores y usuarios que dependen de S3 para grandes cantidades de datos deben tener en cuenta esta característica al diseñar sus arquitecturas y procesos. Implementar un correcto monitoreo y aplicar las políticas de limpieza adecuadas ayudará a evitar pérdidas de productividad debido a operaciones que pueden bloquear servicios o sobrepasar límites de tiempo de espera como ocurrió en el caso de Databend.
Finalmente, resulta fundamental considerar que la experiencia de usuario al interactuar con S3 puede variar muchísimo dependiendo del patrón de uso, la cantidad de datos y las configuraciones aplicadas. Lo que para un bucket pequeño puede ser una consulta instantánea, en un entorno a escala puede transformarse en un cuello de botella que requiere atención técnica especializada. En resumen, la lentitud en las respuestas del comando ListObjects de Amazon S3, que puede llegar a tomar hasta 120 segundos, se explica principalmente por la acumulación de marcadores de eliminación en buckets con versionado. Estos marcadores obligan a S3 a realizar operaciones adicionales de filtrado que afectan el rendimiento. La solución para optimizar y acelerar estas consultas pasa por habilitar y configurar políticas de ciclo de vida que eliminen estos marcadores y controlen versiones antiguas, además de evaluar cuidadosamente cuándo es indispensable usar el versionado.
De esta forma, se puede preservar la integridad y seguridad que aporta el versionado sin sacrificar la eficiencia y velocidad necesarias para la gestión moderna de datos en la nube.