19.4. Consumo de recursos #

19.4.1. Memoria
19.4.2. Disco
19.4.3. Uso de recursos del kernel
19.4.4. Escritor en segundo plano (Background Writer)
19.4.5. E/S
19.4.6. Procesos worker (Worker Processes)

19.4.1. Memoria #

shared_buffers (integer) #

Establece la cantidad de memoria que el servidor de base de datos utiliza para los búferes de memoria compartida. El valor predeterminado es normalmente 128 megabytes (128MB), pero puede ser menor si la configuración de tu kernel no lo soporta (según lo determinado durante initdb). Esta configuración debe ser de al menos 128 kilobytes. Sin embargo, normalmente se necesitan configuraciones significativamente más altas que el mínimo para obtener un buen rendimiento. Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. (Los valores no predeterminados de BLCKSZ cambian el valor mínimo). Este parámetro solo se puede establecer al inicio del servidor.

Si tienes un servidor de base de datos dedicado con 1GB o más de RAM, un valor inicial razonable para shared_buffers es el 25% de la memoria de tu sistema. Hay algunas cargas de trabajo donde configuraciones incluso más grandes para shared_buffers son efectivas, pero debido a que PostgreSQL también depende de la caché del sistema operativo, es poco probable que una asignación de más del 40% de la RAM a shared_buffers funcione mejor que una cantidad menor. Las configuraciones más grandes para shared_buffers normalmente requieren un aumento correspondiente en max_wal_size, con el fin de repartir el proceso de escritura de grandes cantidades de datos nuevos o modificados durante un período de tiempo más largo.

En sistemas con menos de 1GB of RAM, es apropiado un porcentaje menor de RAM, para dejar espacio adecuado para el sistema operativo.

huge_pages (enum) #

Controla si se solicitan páginas gigantes (huge pages) para la región de memoria compartida principal. Los valores válidos son try (el valor predeterminado), on y off. Este parámetro solo se puede establecer al inicio del servidor. Con huge_pages configurado en try, el servidor intentará solicitar páginas gigantes, pero volverá al valor predeterminado si eso falla. Con on, el fallo al solicitar páginas gigantes evitará que el servidor se inicie. Con off, no se solicitarán páginas gigantes. El estado real de las páginas gigantes se indica mediante la variable del servidor huge_pages_status.

Actualmente, esta configuración solo se soporta en Linux y Windows. La configuración se ignora en otros sistemas cuando se establece en try. En Linux, solo se soporta cuando shared_memory_type está configurado en mmap (el valor predeterminado).

El uso de páginas gigantes da como resultado tablas de páginas más pequeñas y menos tiempo de CPU dedicado a la gestión de memoria, aumentando el rendimiento. Para más detalles sobre el uso de páginas gigantes en Linux, consulta la Section 18.4.5.

Las páginas gigantes se conocen como «large pages» en Windows. Para usarlas, necesitas asignar el derecho de usuario Lock pages in memory a la cuenta de usuario de Windows que ejecuta PostgreSQL. Puedes usar la herramienta de Directiva de grupo de Windows (gpedit.msc) para asignar el derecho de usuario Lock pages in memory. Para iniciar el servidor de base de datos en la línea de comandos como un proceso independiente, no como un servicio de Windows, el símbolo del sistema debe ejecutarse como administrador o el Control de cuentas de usuario (UAC) debe estar deshabilitado. Cuando el UAC está habilitado, el símbolo del sistema normal revoca el derecho de usuario Lock pages in memory al iniciarse.

Ten en cuenta que esta configuración solo afecta a la región de memoria compartida principal. Los sistemas operativos como Linux, FreeBSD e Illumos también pueden usar páginas gigantes (también conocidas como páginas super o páginas large) automáticamente para la asignación de memoria normal, sin una solicitud explícita de PostgreSQL. En Linux, esto se llama transparent huge pages (THP). Se sabe que esa característica causa degradación del rendimiento con PostgreSQL para algunos usuarios en algunas versiones de Linux, por lo que actualmente se desaconseja su uso (a diferencia del uso explícito de huge_pages).

huge_page_size (integer) #

Controla el tamaño de las páginas gigantes, cuando están habilitadas con huge_pages. El valor predeterminado es cero (0). Cuando se establece en 0, se utilizará el tamaño de página gigante predeterminado en el sistema. Este parámetro solo se puede establecer al inicio del servidor.

Algunos tamaños de página comúnmente disponibles en arquitecturas de servidores modernas de 64 bits incluyen: 2MB y 1GB (Intel y AMD), 16MB y 16GB (IBM POWER), y 64kB, 2MB, 32MB y 1GB (ARM). Para más información sobre el uso y soporte, consulta la Section 18.4.5.

Las configuraciones no predeterminadas actualmente solo se soportan en Linux.

temp_buffers (integer) #

Establece la cantidad máxima de memoria utilizada para los búferes temporales dentro de cada sesión de base de datos. Estos son búferes locales de la sesión que se usan solo para el acceso a tablas temporales. Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es ocho megabytes (8MB). (Si BLCKSZ no es 8kB, el valor predeterminado se escala proporcionalmente a este). Esta configuración se puede cambiar dentro de sesiones individuales, pero solo antes del primer uso de tablas temporales dentro de la sesión; los intentos posteriores de cambiar el valor no tendrán efecto en esa sesión.

Una sesión asignará búferes temporales según sea necesario hasta el límite dado por temp_buffers. El coste de establecer un valor grande en sesiones que realmente no necesitan muchos búferes temporales es solo un descriptor de búfer, o unos 64 bytes, por cada incremento en temp_buffers. Sin embargo, si un búfer se utiliza realmente, se consumirán 8192 bytes adicionales para él (o en general, BLCKSZ bytes).

max_prepared_transactions (integer) #

Establece el número máximo de transacciones que pueden estar en el estado «preparada» (prepared) simultáneamente (consulta la PREPARE TRANSACTION). Establecer este parámetro en cero (que es el valor predeterminado) deshabilita la característica de transacciones preparadas. Este parámetro solo se puede establecer al inicio del servidor.

Si no estás planeando usar transacciones preparadas, este parámetro debe establecerse en cero para evitar la creación accidental de transacciones preparadas. Si estás usando transacciones preparadas, probablemente querrás que max_prepared_transactions sea al menos tan grande como max_connections, para que cada sesión pueda tener una transacción preparada pendiente.

Al ejecutar un servidor en espera (standby), debes establecer este parámetro en el mismo valor o en uno superior al del servidor primario. De lo contrario, no se permitirán consultas en el servidor en espera.

work_mem (integer) #

Establece la cantidad máxima base de memoria que utilizará una operación de consulta (como una ordenación o una tabla hash) antes de escribir en archivos de disco temporales. Si este valor se especifica sin unidades, se toma como kilobytes. El valor predeterminado es cuatro megabytes (4MB). Ten en cuenta que una consulta compleja podría realizar varias operaciones de ordenación y de hash al mismo tiempo, y a cada operación generalmente se le permite usar tanta memoria como especifica este valor antes de que comience a escribir datos en archivos temporales. Además, varias sesiones en ejecución podrían estar realizando tales operaciones simultáneamente. Por lo tanto, la memoria total utilizada podría ser muchas veces el valor de work_mem; es necesario tener en cuenta este hecho al elegir el valor. Las operaciones de ordenación se utilizan para ORDER BY, DISTINCT y merge joins. Las tablas hash se utilizan en hash joins, agregación basada en hash, nodos de memoize y procesamiento basado en hash de subconsultas IN.

Las operaciones basadas en hash son generalmente más sensibles a la disponibilidad de memoria que las operaciones equivalentes basadas en ordenación. El límite de memoria para una tabla hash se calcula multiplicando work_mem por hash_mem_multiplier. Esto hace posible que las operaciones basadas en hash utilicen una cantidad de memoria que supera la cantidad base habitual de work_mem.

hash_mem_multiplier (floating point) #

Se utiliza para calcular la cantidad máxima de memoria que las operaciones basadas en hash pueden utilizar. El límite final se determina multiplicando work_mem por hash_mem_multiplier. El valor predeterminado es 2.0, lo que hace que las operaciones basadas en hash utilicen el doble de la cantidad base habitual de work_mem.

Considera aumentar hash_mem_multiplier en entornos donde el desbordamiento (spilling) a disco por operaciones de consulta ocurre con regularidad, especialmente cuando simplemente aumentar work_mem produce presión de memoria (la presión de memoria normalmente toma la forma de errores intermitentes de falta de memoria). La configuración predeterminada de 2.0 suele ser efectiva con cargas de trabajo mixtas. Las configuraciones más altas en el rango de 2.0 - 8.0 o más pueden ser efectivas en entornos donde work_mem ya se ha aumentado a 40MB o más.

maintenance_work_mem (integer) #

Especifica la cantidad máxima de memoria que utilizarán las operaciones de mantenimiento, como VACUUM, CREATE INDEX y ALTER TABLE ADD FOREIGN KEY. Si este valor se especifica sin unidades, se toma como kilobytes. El valor predeterminado es 64 megabytes (64MB). Dado que solo una de estas operaciones se puede ejecutar a la vez en una sesión de base de datos, y una instalación normalmente no tiene muchas de ellas ejecutándose simultáneamente, es seguro establecer este valor significativamente más grande que work_mem. Las configuraciones más grandes podrían mejorar el rendimiento para el vacuuming y para restaurar volcados de bases de datos.

Ten en cuenta que cuando se ejecuta el autovacuum, se puede asignar hasta autovacuum_max_workers veces esta memoria, así que ten cuidado de no establecer el valor predeterminado demasiado alto. Puede ser útil controlar esto configurando por separado autovacuum_work_mem.

autovacuum_work_mem (integer) #

Especifica la cantidad máxima de memoria que utilizará cada proceso autovacuum worker. Si este valor se especifica sin unidades, se toma como kilobytes. El valor predeterminado es -1, lo que indica que se debe usar el valor de maintenance_work_mem en su lugar. La configuración no tiene efecto en el comportamiento de VACUUM cuando se ejecuta en otros contextos. Este parámetro solo se puede establecer en el archivo postgresql.conf o en la línea de comandos del servidor.

vacuum_buffer_usage_limit (integer) #

Especifica el tamaño de la estrategia de acceso al búfer (Buffer Access Strategy) utilizada por los comandos VACUUM y ANALYZE. Una configuración de 0 permitirá que la operación utilice cualquier número de shared_buffers. De lo contrario, los tamaños válidos oscilan entre 128 kB y 16 GB. Si el tamaño especificado supera 1/8 del tamaño de shared_buffers, el tamaño se limita silenciosamente a ese valor. El valor predeterminado es 2MB. Si este valor se especifica sin unidades, se toma como kilobytes. Este parámetro se puede establecer en cualquier momento. Se puede anular para VACUUM and ANALYZE al pasar la opción BUFFER_USAGE_LIMIT. Las configuraciones más altas pueden permitir que VACUUM y ANALYZE se ejecuten más rápidamente, pero tener una configuración demasiado grande puede hacer que se desalojen demasiadas páginas útiles de los búferes compartidos.

logical_decoding_work_mem (integer) #

Especifica la cantidad máxima de memoria que utilizará la decodificación lógica, antes de que algunos de los cambios decodificados se escriban en el disco local. Esto limita la cantidad de memoria utilizada por las conexiones de replicación en streaming lógica. El valor predeterminado es 64 megabytes (64MB). Dado que cada conexión de replicación solo utiliza un único búfer de este tamaño, y una instalación normalmente no tiene muchas de tales conexiones simultáneamente (según lo limitado por max_wal_senders), es seguro establecer este valor significativamente más alto que work_mem, reduciendo la cantidad de cambios decodificados escritos en el disco.

commit_timestamp_buffers (integer) #

Especifica la cantidad de memoria a utilizar para almacenar en caché el contenido de pg_commit_ts (consulta la Table 66.1). Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es 0, lo que solicita shared_buffers/512 hasta 1024 bloques, pero no menos de 16 bloques. Este parámetro solo se puede establecer al inicio del servidor.

multixact_member_buffers (integer) #

Especifica la cantidad de memoria compartida a utilizar para almacenar en caché el contenido de pg_multixact/members (consulta la Table 66.1). Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es 32. Este parámetro solo se puede establecer al inicio del servidor.

multixact_offset_buffers (integer) #

Especifica la cantidad de memoria compartida a utilizar para almacenar en caché el contenido de pg_multixact/offsets (consulta la Table 66.1). Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es 16. Este parámetro solo se puede establecer al inicio del servidor.

notify_buffers (integer) #

Especifica la cantidad de memoria compartida a utilizar para almacenar en caché el contenido de pg_notify (consulta la Table 66.1). Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es 16. Este parámetro solo se puede establecer al inicio del servidor.

serializable_buffers (integer) #

Especifica la cantidad de memoria compartida a utilizar para almacenar en caché el contenido de pg_serial (consulta la Table 66.1). Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es 32. Este parámetro solo se puede establecer al inicio del servidor.

subtransaction_buffers (integer) #

Especifica la cantidad de memoria compartida a utilizar para almacenar en caché el contenido de pg_subtrans (consulta la Table 66.1). Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es 0, lo que solicita shared_buffers/512 hasta 1024 bloques, pero no menos de 16 bloques. Este parámetro solo se puede establecer al inicio del servidor.

transaction_buffers (integer) #

Especifica la cantidad de memoria compartida a utilizar para almacenar en caché el contenido de pg_xact (consulta la Table 66.1). Si este valor se especifica sin unidades, se toma como bloques, es decir, BLCKSZ bytes, normalmente 8kB. El valor predeterminado es 0, lo que solicita shared_buffers/512 hasta 1024 bloques, pero no menos de 16 bloques. Este parámetro solo se puede establecer al inicio del servidor.

max_stack_depth (integer) #

Especifica la profundidad máxima segura de la pila de ejecución del servidor. La configuración ideal para este parámetro es el límite real del tamaño de la pila impuesto por el kernel (según lo establecido por ulimit -s o su equivalente local), menos un margen de seguridad de un megabyte aproximadamente. El margen de seguridad es necesario porque la profundidad de la pila no se comprueba en cada rutina en el servidor, sino solo en rutinas potencialmente recursivas clave. Si este valor se especifica sin unidades, se toma como kilobytes. La configuración predeterminada es de dos megabytes (2MB), que es conservadoramente pequeña y con poco riesgo de causar caídas del servidor. Sin embargo, podría ser demasiado pequeña para permitir la ejecución de funciones complejas. Solo los superusuarios y los usuarios con el privilegio SET adecuado pueden cambiar esta configuración.

Establecer max_stack_depth por encima de límite real del kernel significará que una función recursiva desbocada puede hacer caer un proceso backend individual. En plataformas donde PostgreSQL puede determinar el límite del kernel, el servidor no permitirá que esta variable se establezca en un valor inseguro. Sin embargo, no todas las plataformas proporcionan la información, por lo que se recomienda precaución al seleccionar un valor.

shared_memory_type (enum) #

Especifica la implementación de memoria compartida que el servidor debe usar para la región de memoria compartida principal que contiene los búferes compartidos de PostgreSQL y otros datos compartidos. Los valores posibles son mmap (para memoria compartida anónima asignada mediante mmap), sysv (para memoria compartida System V asignada mediante shmget) y windows (para memoria compartida de Windows). No todos los valores son soportados en todas las plataformas; la primera opción soportada es la predeterminada para esa plataforma. El uso de la opción sysv, que no es la predeterminada en ninguna plataforma, generalmente se desaconseja porque normalmente requiere configuraciones de kernel no predeterminadas para permitir asignaciones grandes (consulta la Section 18.4.1). Este parámetro solo se puede establecer al inicio del servidor.

dynamic_shared_memory_type (enum) #

Especifica la implementación de memoria compartida dinámica que el servidor debe usar. Los valores posibles son posix (para memoria compartida POSIX asignada mediante shm_open), sysv (para memoria compartida System V asignada mediante shmget), windows (para memoria compartida de Windows) y mmap (para simular memoria compartida usando archivos mapeados en memoria almacenados en el directorio de datos). No todos los valores son soportados en todas las plataformas; la primera opción soportada suele ser la predeterminada para esa plataforma. El uso de la opción mmap, que no es la predeterminada en ninguna plataforma, generalmente se desaconseja porque el sistema operativo puede escribir las páginas modificadas en el disco repetidamente, aumentando la carga de E/S del sistema; sin embargo, puede ser útil para la depuración, cuando el directorio pg_dynshmem se almacena en un disco RAM, o cuando no están disponibles otros mecanismos de memoria compartida. Este parámetro solo se puede establecer al inicio del servidor.

min_dynamic_shared_memory (integer) #

Especifica la cantidad de memoria que se debe asignar al inicio del servidor para su uso por consultas paralelas. Cuando esta región de memoria es insuficiente o se agota por consultas concurrentes, las nuevas consultas paralelas intentan asignar memoria compartida adicional temporalmente del sistema operativo utilizando el método configurado con dynamic_shared_memory_type, lo que puede ser más lento debido a los gastos generales de gestión de memoria. La memoria que se asigna al inicio con min_dynamic_shared_memory se ve afectada por la configuración de huge_pages en los sistemas operativos donde se soporta, y puede ser más probable que se beneficie de páginas más grandes en sistemas operativos donde esto se gestiona automáticamente. El valor predeterminado es 0 (ninguno). Este parámetro solo se puede establecer al inicio del servidor.

19.4.2. Disco #

temp_file_limit (integer) #

Especifica la cantidad máxima de espacio en disco que un proceso puede usar para archivos temporales, como archivos temporales de ordenación y hash, o el archivo de almacenamiento para un cursor retenido. Una transacción que intente superar este límite será cancelada. If this value is specified without units, it is taken as kilobytes. -1 (el valor predeterminado) significa que no hay límite. Solo los superusuarios y los usuarios con el privilegio SET adecuado pueden cambiar esta configuración.

Esta configuración limita el espacio total utilizado en cualquier instante por todos los archivos temporales utilizados por un proceso de PostgreSQL dado. Debe tenerse en cuenta que el espacio en disco utilizado para tablas temporales explícitas, a diferencia de los archivos temporales utilizados tras bambalinas en la ejecución de consultas, no cuenta para este límite.

file_copy_method (enum) #

Especifica el método utilizado para copiar archivos. Los valores posibles son COPY (predeterminado) y CLONE (si el soporte del sistema operativo está disponible).

Este parámetro afecta a:

  • CREATE DATABASE ... STRATEGY=FILE_COPY

  • ALTER DATABASE ... SET TABLESPACE ...

CLONE utiliza las llamadas al sistema copy_file_range() (Linux, FreeBSD) o copyfile (macOS), dando al kernel la oportunidad de compartir bloques de disco o delegar el trabajo a capas inferiores en algunos sistemas de archivos.

file_extend_method (enum) #

Especifica el método utilizado para extender archivos de datos durante operaciones en bloque como COPY. La primera opción disponible se utiliza como predeterminada, dependiendo del sistema operativo:

  • posix_fallocate (Unix) utiliza la interfaz estándar POSIX para asignar espacio en disco, pero falta en algunos sistemas. Si está presente pero el sistema de archivos subyacente no la soporta, esta opción vuelve silenciosamente a write_zeros. Se sabe que las versiones actuales de BTRFS deshabilitan la compresión cuando se utiliza esta opción. Esta es la opción predeterminada en los sistemas que tienen la función.

  • write_zeros extiende los archivos escribiendo bloques de bytes cero. Esta es la opción predeterminada en los sistemas que no tienen la función posix_fallocate.

El método write_zeros siempre se utiliza cuando los archivos de datos se extienden en 8 bloques o menos.

max_notify_queue_pages (integer) #

Especifica la cantidad máxima de páginas asignadas para la cola de NOTIFY / LISTEN. El valor predeterminado es 1048576. Para páginas de 8 KB permite consumir hasta 8 GB de espacio en disco. Este parámetro solo se puede establecer al inicio del servidor.

19.4.3. Uso de recursos del kernel #

max_files_per_process (integer) #

Establece el número máximo de archivos abiertos que cada subproceso del servidor tiene permitido abrir simultáneamente; los archivos ya abiertos en el postmaster no cuentan para este límite. El valor predeterminado es de mil archivos.

Si el kernel está imponiendo un límite seguro por proceso, no necesitas preocuparte por esta configuración. Pero en algunas plataformas (especialmente en la mayoría de los sistemas BSD), el kernel permitirá que los procesos individuales abran muchos más archivos de los que el sistema realmente puede soportar si muchos procesos intentan abrir esa cantidad de archivos. Si ves fallos de tipo Too many open files, intenta reducir esta configuración. Este parámetro solo se puede establecer al inicio del servidor.

19.4.4. Escritor en segundo plano (Background Writer) #

Existe un proceso de servidor independiente llamado background writer (escritor en segundo plano), cuya función es realizar escrituras de búferes compartidos sucios (nuevos o modificados). Cuando el número de búferes compartidos limpios parece ser insuficiente, el escritor en segundo plano escribe algunos búferes sucios en el sistema de archivos y los marca como limpios. Esto reduce la probabilidad de que los procesos del servidor que manejan consultas de usuarios no puedan encontrar búferes limpios y tengan que escribir ellos mismos los búferes sucios. Sin embargo, el escritor en segundo plano causa un aumento neto global en la carga de E/S, porque mientras que una página repetidamente modificada podría, de otro modo, escribirse solo una vez por intervalo de checkpoint, el escritor en segundo plano podría escribirla varias veces a medida que se ensucia en el mismo intervalo. Los parámetros analizados en esta subsección se pueden utilizar para ajustar el comportamiento a las necesidades locales.

bgwriter_delay (integer) #

Especifica el retraso entre las rondas de actividad del escritor en segundo plano. En cada ronda, el escritor realiza escrituras para un cierto número de búferes sucios (controlable por los siguientes parámetros). Luego duerme durante la duración de bgwriter_delay, y repite. Sin embargo, cuando no hay búferes sucios en el pool de búferes, entra en un sueño más prolongado independientemente de bgwriter_delay. If this value is specified without units, it is taken as milliseconds. El valor predeterminado es 200 milisegundos (200ms). Ten en cuenta que en algunos sistemas, la resolución efectiva de los retrasos de sueño es de 10 milisegundos; configurar bgwriter_delay a un valor que no sea múltiplo de 10 podría tener los mismos resultados que configurarlo al siguiente múltiplo superior de 10. Este parámetro solo se puede establecer en el archivo postgresql.conf o en la línea de comandos del servidor.

bgwriter_lru_maxpages (integer) #

En cada ronda, el escritor en segundo plano no escribirá más de esta cantidad de búferes. Establecer esto en cero deshabilita la escritura en segundo plano. (Ten en cuenta que los checkpoints, que son gestionados por un proceso auxiliar dedicado independiente, no se ven afectados). El valor predeterminado es 100 búferes. Este parámetro solo se puede establecer en el archivo postgresql.conf o en la línea de comandos del servidor.

bgwriter_lru_multiplier (floating point) #

El número de búferes sucios escritos en cada ronda se basa en el número de búferes nuevos que han necesitado los procesos del servidor durante las rondas recientes. La necesidad reciente promedio se multiplica por bgwriter_lru_multiplier para llegar a una estimación del número de búferes que se necesitarán durante la siguiente ronda. Los búferes sucios se escriben hasta que haya esa cantidad de búferes limpios y reutilizables disponibles. (Sin embargo, no se escribirán más de bgwriter_lru_maxpages búferes por ronda). Por lo tanto, una configuración de 1.0 representa una política de justo a tiempo de escribir exactamente el número de búferes estimado que se necesitará. Los valores más grandes proporcionan cierto margen contra picos en la demanda, mientras que los valores más pequeños dejan intencionadamente que las escrituras sean realizadas por los procesos del servidor. El valor predeterminado es 2.0. Este parámetro solo se puede establecer en el archivo postgresql.conf o en la línea de comandos del servidor.

bgwriter_flush_after (integer) #

Cada vez que el escritor en segundo plano haya escrito más de esta cantidad de datos, intenta forzar al sistema operativo a emitir estas escrituras al almacenamiento subyacente. Hacerlo limitará la cantidad de datos sucios en la caché de páginas del kernel, reduciendo la probabilidad de bloqueos cuando se emite un fsync al final de un checkpoint, o cuando el sistema operativo escribe datos en lotes más grandes en segundo plano. A menudo, eso dará como resultado una latencia de transacción muy reducida, pero también hay algunos casos, especialmente con cargas de trabajo que son mayores que shared_buffers pero menores que la caché de páginas del sistema operativo, donde el rendimiento podría degradarse. Esta configuración puede no tener efecto en algunas plataformas. Si este valor se especifica sin unidades, es tomado como bloques, es decir, BLCKSZ bytes, típicamente 8kB. El rango válido está entre 0, que deshabilita la escritura forzada, y 2MB. El valor predeterminado es 512kB en Linux, 0 en otros lugares. (Si BLCKSZ no es 8kB, los valores predeterminado y máximo se escalan proporcionalmente a este). Este parámetro solo se puede establecer en el archivo postgresql.conf o en la línea de comandos del servidor.

Valores más pequeños de bgwriter_lru_maxpages y bgwriter_lru_multiplier reducen la carga de E/S adicional causada por el escritor en segundo plano, pero aumentan la probabilidad de que los procesos del servidor tengan que emitir escrituras por sí mismos, retrasando las consultas interactivas.

19.4.5. E/S #

backend_flush_after (integer) #

Cada vez que un único backend haya escrito más de esta cantidad de datos, intenta forzar al sistema operativo a emitir estas escrituras al almacenamiento subyacente. Hacerlo limitará la cantidad de datos sucios en la caché de páginas del kernel, reduciendo la probabilidad de bloqueos cuando se emite un fsync al final de un checkpoint, o cuando el sistema operativo escribe datos en lotes más grandes en segundo plano. A menudo, eso dará como resultado una latencia de transacción muy reducida, pero también hay algunos casos, especialmente con cargas de trabajo que son mayores que shared_buffers pero menores que la caché de páginas del sistema operativo, donde el rendimiento podría degradarse. Esta configuración puede no tener efecto en algunas plataformas. Si este valor se especifica sin unidades, es tomado como bloques, es decir, BLCKSZ bytes, típicamente 8kB. El rango válido está entre 0, que deshabilita la escritura forzada, y 2MB. El valor predeterminado es 0, es decir, sin escritura forzada. (Si BLCKSZ no es 8kB, el valor máximo se escala proporcionalmente a este).

effective_io_concurrency (integer) #

Establece el número de operaciones simultáneas de E/S de almacenamiento que PostgreSQL espera que se puedan ejecutar simultáneamente. Aumentar este valor incrementará el número de operaciones de E/S que cualquier sesión individual de PostgreSQL intente iniciar en paralelo. El rango permitido es de 1 a 1000, o 0 para deshabilitar la emisión de solicitudes de E/S asíncronas. El valor predeterminado es 16.

Los valores más altos tendrán un mayor impacto en el almacenamiento de mayor latencia, donde las consultas de otro modo experimentarían bloqueos notables de E/S, y en dispositivos con altos IOPs. Los valores innecesariamente altos pueden aumentar la latencia de E/S para todas las consultas en el sistema.

En sistemas con soporte para asesoramiento de lectura anticipada (prefetch advice), effective_io_concurrency también controla la distancia de lectura anticipada (prefetch distance).

Este valor se puede anular para tablas en un tablespace particular configurando el parámetro de tablespace del mismo nombre (consulta la ALTER TABLESPACE).

maintenance_io_concurrency (integer) #

Similar a effective_io_concurrency, pero utilizado para el trabajo de mantenimiento que se realiza en nombre de muchas sesiones de clientes.

El valor predeterminado es 16. Este valor se puede anular para tablas en un tablespace particular configurando el parámetro de tablespace del mismo nombre (consulta la ALTER TABLESPACE).

io_max_combine_limit (integer) #

Controla el tamaño de E/S más grande en operaciones que combinan E/S, y limita silenciosamente el parámetro configurable por el usuario io_combine_limit. Este parámetro solo se puede establecer al inicio del servidor. Si este valor se especifica sin unidades, es tomado como bloques, es decir, BLCKSZ bytes, típicamente 8kB. El tamaño máximo posible depende del sistema operativo y del tamaño de bloque, pero normalmente es de 1MB en Unix y 128kB en Windows. El valor predeterminado es 128kB.

io_combine_limit (integer) #

Controla el tamaño de E/S más grande en operaciones que combinan E/S. Si se establece por encima del parámetro io_max_combine_limit, se utilizará silenciosamente el valor más bajo en su lugar, por lo que puede ser necesario aumentar ambos para incrementar el tamaño de E/S. Si este valor se especifica sin unidades, es tomado como bloques, es decir, BLCKSZ bytes, típicamente 8kB. El tamaño máximo posible depende del sistema operativo y del tamaño de bloque, pero normalmente es de 1MB en Unix y 128kB en Windows. El valor predeterminado es 128kB.

io_max_concurrency (integer) #

Controla el número máximo de operaciones de E/S que un proceso puede ejecutar simultáneamente.

La configuración predeterminada de -1 selecciona un número basado en shared_buffers y el número máximo de procesos (max_connections, autovacuum_worker_slots, max_worker_processes y max_wal_senders), pero no más de 64.

Este parámetro solo se puede establecer al inicio del servidor.

io_method (enum) #

Selecciona el método para ejecutar E/S asíncrona. Los valores posibles son:

  • worker (ejecutar E/S asíncrona utilizando procesos worker)

  • io_uring (ejecutar E/S asíncrona utilizando io_uring, requiere una compilación con --with-liburing / -Dliburing)

  • sync (ejecutar E/S apta para asíncrona de forma síncrona)

El valor predeterminado es worker.

Este parámetro solo se puede establecer al inicio del servidor.

io_workers (integer) #

Selecciona el número de procesos worker de E/S a utilizar. El valor predeterminado es 3. Este parámetro solo se puede establecer en el archivo postgresql.conf o en la línea de comandos del servidor.

Solo tiene efecto si io_method está configurado en worker.

19.4.6. Procesos worker (Worker Processes) #

max_worker_processes (integer) #

Establece el número máximo de procesos en segundo plano que el clúster puede soportar. Este parámetro solo se puede establecer al inicio del servidor. El valor predeterminado es 8.

Al ejecutar un servidor en espera (standby), debes establecer este parámetro en el mismo valor o en uno superior al del servidor primario. De lo contrario, no se permitirán consultas en el servidor en espera.

Al cambiar este valor, considera también ajustar max_parallel_workers, max_parallel_maintenance_workers y max_parallel_workers_per_gather.

max_parallel_workers_per_gather (integer) #

Establece el número máximo de workers que pueden ser iniciados por un único nodo Gather o Gather Merge. Los workers paralelos se toman del pool de procesos establecido por max_worker_processes, limitado por max_parallel_workers. Ten en cuenta que la cantidad solicitada de workers podría no estar realmente disponible en tiempo de ejecución. Si esto ocurre, el plan se ejecutará con menos workers de los previstos, lo que puede ser ineficiente. El valor predeterminado es 2. Establecer este valor en 0 deshabilita la ejecución de consultas paralelas.

Ten en cuenta que las consultas paralelas pueden consumir sustancialmente más recursos que las consultas no paralelas, porque cada proceso worker es un proceso completamente independiente que tiene aproximadamente el mismo impacto en el sistema que una sesión de usuario adicional. Esto debe tenerse en cuenta al elegir un valor para esta configuración, así como al configurar otras opciones que controlan la utilización de recursos, tales como work_mem. Los límites de recursos como work_mem se aplican individualmente a cada worker, lo que significa que la utilización total puede ser mucho mayor en todos los procesos de lo que sería normalmente para cualquier proceso individual. Por ejemplo, una consulta paralela que utiliza 4 workers puede usar hasta 5 veces más tiempo de CPU, memoria, ancho de banda de E/S, etc., que una consulta que no utiliza ningún worker.

Para obtener más información sobre consultas paralelas, consulta la Chapter 15.

max_parallel_maintenance_workers (integer) #

Establece el número máximo de workers paralelos que pueden ser iniciados por un único comando de utilidad. Actualmente, los comandos de utilidad paralelos que soportan el uso de workers paralelos son CREATE INDEX al construir un índice B-tree, GIN o BRIN, y VACUUM sin la opción FULL. Los workers paralelos se toman del pool de procesos establecido por max_worker_processes, limitado por max_parallel_workers. Ten en cuenta que la cantidad solicitada de workers podría no estar realmente disponible en tiempo de ejecución. Si esto ocurre, la operación de utilidad se ejecutará con menos workers de los previstos. El valor predeterminado es 2. Establecer este valor en 0 deshabilita el uso de workers paralelos por parte de los comandos de utilidad.

Ten en cuenta que los comandos de utilidad paralelos no deberían consumir sustancialmente más memoria que las operaciones no paralelas equivalentes. Esta estrategia difiere de la de las consultas paralelas, donde los límites de recursos generalmente se aplican por proceso worker. Los comandos de utilidad paralelos tratan el límite de recursos maintenance_work_mem como un límite que se aplica a todo el comando de utilidad, independientemente del número de procesos worker paralelos. Sin embargo, los comandos de utilidad paralelos aún pueden consumir sustancialmente más recursos de CPU y ancho de banda de E/S.

max_parallel_workers (integer) #

Establece la cantidad máxima de workers que el clúster puede soportar para operaciones paralelas. El valor predeterminado es 8. Al aumentar o disminuir este valor, considera también ajustar max_parallel_maintenance_workers y max_parallel_workers_per_gather. Además, ten en cuenta que una configuración para este valor que sea superior a max_worker_processes no tendrá efecto, ya que los workers paralelos se toman del pool de procesos worker establecido por esa configuración.

parallel_leader_participation (boolean) #

Permite que el proceso líder ejecute el plan de consulta bajo los nodos Gather y Gather Merge en lugar de esperar a los procesos worker. El valor predeterminado es on. Establecer este valor en off reduce la probabilidad de que los workers se bloqueen porque el líder no está leyendo las tuplas lo suficientemente rápido, pero requiere que el proceso líder espere a que los procesos worker se inicien antes de que se puedan producir las primeras tuplas. El grado en que el líder puede ayudar o perjudicar el rendimiento depende del tipo de plan, el número de workers y la duración de la consulta.