Autor: Francisco

  • Diagnóstico de memoria y versión en SQL Server

    Contexto

    Servidor de ejemplo con las siguientes características: 30GB de disco, 2 vCPU, 4GB de RAM, collation Modern_Spanish_CI_AS. Este tipo de diagnóstico es útil cuando un servidor de SQL Server empieza a mostrar señales de presión de memoria, o simplemente para confirmar exactamente qué versión y edición está corriendo antes de planificar un cambio.

    1. Versión y edición del motor

    Lo primero es confirmar exactamente qué se está ejecutando — la edición determina límites como cuánta RAM puede usar el buffer pool:

    SELECT
        SERVERPROPERTY('Edition')       AS edition,
        SERVERPROPERTY('ProductVersion') AS version,
        SERVERPROPERTY('EngineEdition') AS engine_edition;

    2. Límite de memoria configurado (max server memory)

    SQL Server, por defecto, puede intentar usar prácticamente toda la RAM disponible del servidor si no se configura un límite explícito. Esta consulta muestra qué valor está configurado actualmente:

    SELECT name, value_in_use
    FROM sys.configurations
    WHERE name = 'max server memory (MB)';

    3. Uso total de memoria del proceso SQL Server

    Para ver cuánta memoria está usando realmente el proceso completo, incluyendo memoria virtual comprometida:

    SELECT
        physical_memory_in_use_kb   / 1024 AS memory_in_use_MB,
        large_page_allocations_kb   / 1024 AS large_page_MB,
        locked_page_allocations_kb  / 1024 AS locked_page_MB,
        total_virtual_address_space_kb / 1024 AS total_virtual_MB,
        virtual_address_space_committed_kb / 1024 AS committed_virtual_MB
    FROM sys.dm_os_process_memory;

    4. Uso de memoria por tipo (memory clerks)

    SQL Server organiza internamente su consumo de memoria en «clerks» según el componente que la usa (buffer pool, caché de planes de ejecución, etc.). Esta consulta agrupa el consumo por tipo, de mayor a menor:

    SELECT
        type,
        SUM(pages_kb) / 1024 AS memory_MB
    FROM sys.dm_os_memory_clerks
    GROUP BY type
    ORDER BY memory_MB DESC;

    5. Buffer pool específico

    El buffer pool es el componente que cachea páginas de datos en memoria para evitar lecturas a disco — es justo lo que las ediciones Express y Standard limitan agresivamente. Esta consulta aísla específicamente cuánto está usando:

    SELECT
        SUM(pages_kb) / 1024 AS buffer_pool_MB
    FROM sys.dm_os_memory_clerks
    WHERE type = 'MEMORYCLERK_SQLBUFFERPOOL';

    Resumen de lo que responde cada consulta

    PreguntaDMV / Vista utilizada
    ¿Qué edición y versión está corriendo?SERVERPROPERTY
    ¿Cuánto está configurado como límite de RAM?sys.configurations
    ¿Cuánta RAM usa el proceso completo de SQL?sys.dm_os_process_memory
    ¿Qué componentes están consumiendo más memoria?sys.dm_os_memory_clerks
    ¿Cuánto usa el buffer pool (el que se limita)?sys.dm_os_memory_clerks
  • Configurando un relay SMTP ligero con Postfix en un contenedor LXC

    Objetivo

    Configurar un relay SMTP ligero en un contenedor LXC, utilizando Postfix, para que cualquier VM o contenedor de la red local del homelab pueda enviar alertas y notificaciones sin necesidad de configurar contraseñas individuales en cada servicio. Todo el tráfico se centraliza y reenvía hacia una cuenta de correo externa.

    Diagnóstico y problemas resueltos

    Descarte de Proxmox Mail Gateway

    Inicialmente se evaluó Proxmox Mail Gateway (PMG), pero se descartó por su elevado consumo de recursos (~4GB de RAM). Postfix, en cambio, consume menos de 15MB de RAM en reposo — una diferencia enorme para un homelab con recursos limitados.

    Apertura de la interfaz local

    La configuración por defecto de Postfix viene limitada a loopback-only (solo escucha a la propia máquina). Se abrió a toda la red local con inet_interfaces = all, para que otros equipos de la LAN puedan usar el relay.

    Bloqueo del puerto 587 por el ISP

    El proveedor de internet tenía bloqueado el puerto 587 saliente, lo que generaba un error de Connection timed out en la cola de correo. La solución fue cambiar al puerto 465 con cifrado SSL/TLS implícito (smtp_tls_wrappermode = yes), que no estaba bloqueado.

    Validación estricta del remitente

    Muchos hostings de correo exigen que el encabezado From: coincida exactamente con la cuenta autenticada. Si no coincide, el mensaje es rechazado aunque la autenticación sea correcta.

    Configuración final de main.cf

    El archivo /etc/postfix/main.cf quedó configurado así para permitir la escucha interna y la salida segura por el puerto 465:

    smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
    biff = no
    append_dot_mydomain = no
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    mydestination = $myhostname, localhost.$mydomain, localhost
    
    # Servidor de destino en puerto seguro 465
    relayhost = [smtp.tudominio.com]:465
    
    # Escuchar en todas las interfaces del contenedor
    inet_interfaces = all
    
    # Redes locales autorizadas a enviar correos sin contraseña
    mynetworks = 127.0.0.0/8, 192.168.0.0/24
    
    recipient_delimiter = +
    compatibility_level = 2
    
    # --- Configuración de autenticación segura (salida al hosting) ---
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    smtp_sasl_security_options = noanonymous
    smtp_sasl_mechanism_filter = plain, login
    
    # Parámetros obligatorios para el puerto 465 (SSL directo)
    smtp_tls_wrappermode = yes
    smtp_tls_security_level = encrypt
    smtp_tls_supported_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, >=TLSv1.2

    Archivo de credenciales

    El archivo /etc/postfix/sasl_passwd contiene la contraseña del buzón emisor, indexada para el puerto 465:

    [smtp.tudominio.com]:465    [email protected]:contraseña

    Comandos utilizados

    Instalación de dependencias

    apt update && apt install postfix libsasl2-modules sasl2-bin mailutils -y

    Indexar la contraseña en la base de datos de Postfix

    postmap /etc/postfix/sasl_passwd

    Asignar permisos seguros al archivo de contraseñas

    chmod 600 /etc/postfix/sasl_passwd

    Reiniciar el servicio

    systemctl restart postfix

    Diagnóstico y pruebas

    Ver el estado de la cola de correos (pendientes o rebotados):

    mailq

    Forzar el envío de los correos retenidos en la cola:

    postfix flush

    Enviar un correo de prueba manual respetando el remitente obligatorio:

    echo "Esta es una prueba de alerta desde el relay del homelab." | mail -s "Test Relay Homelab" -a "From: [email protected]" [email protected]

    Estado de recursos

    El contenedor LXC, con apenas 1 vCPU y 512MB de RAM, quedó en excelentes condiciones de salud tras la configuración. Postfix consume alrededor de 15MB de RAM y 0% de CPU en reposo, sin afectar el rendimiento de otros servicios que corran en el mismo contenedor.