¿Conoces esa sensación cuando una máquina “pequeña” se vuelve silenciosamente crítica para el negocio? Empieza como un puesto de trabajo bajo el escritorio,
luego ejecuta la nómina, después es el servidor de archivos, y finalmente “no lo reinicies, lleva arriba 400 días”. Ese patrón no comenzó con la nube.
Empezó cuando las PC obtuvieron la verdad de hardware suficiente para comportarse como sistemas multiusuario reales.
El Intel 80386—“el 386”, dicho como si lo hubieras poseído—fue el punto de inflexión. No solo ejecutaba software más rápido. Hizo que la arquitectura PC
fuera diferente desde el punto de vista operativo: protección de memoria en la que podías confiar, paginación en la que podías apoyarte, y un modelo de ejecución
que permitió a sistemas operativos serios instalarse y tomar el control. Ahí fue cuando la PC empezó a comportarse como un servidor, y la gente de operaciones
empezó a heredar las consecuencias.
Qué cambió con el 386 (y por qué a operaciones le debe importar)
La historia popular es “surgió lo de 32 bits”. Cierto, pero superficial. Desde la perspectiva de operaciones, el 386 importó porque hizo que la
arquitectura PC dejara de mentirte. Antes, las PC solían ser entornos de tarea única y usuario único que fingían ser computadoras de propósito general.
El 386 hizo práctico ejecutar un SO que aplicara límites: entre procesos, entre usuario y kernel, y entre “este programa tiene errores” y “la máquina entera es ahora un pisapapeles.”
La era 8086/286 podía ofrecer modo protegido, pero era torpe y tan incompatible que muchos sistemas reales seguían en modo real por compatibilidad.
El 386 convirtió el modo protegido en un lugar donde realmente podías vivir. También hizo la paginación práctica y escalable para cargas de trabajo de PC.
La paginación no es solo una característica de memoria; es un contrato operativo: la máquina puede sobrecomprometer memoria y sobrevivir, a costa
de I/O y latencia. Eso es un movimiento de servidor.
El quiebre operativo: de “la aplicación posee la máquina” a “el SO posee la máquina”
En las primeras PC, la aplicación solía llevar la batuta. Accedía al hardware directamente. Asumía que podía garabatear en la memoria. Trataba al SO
como una bibliotecaria amable que traía archivos cuando se le pedía. Ese modelo se derrumba en el momento en que necesitas aislamiento multiusuario,
servicios en segundo plano o cualquier cosa que se parezca a fiabilidad.
El 386 introdujo un entorno de ejecución donde el SO podía imponer reglas sin pasar todo el día disculpándose por la compatibilidad.
Cuando el SO puede imponer reglas, puedes ejecutar múltiples servicios sin asumir que se comportarán. Eso suena a “servidores modernos”,
porque lo es: es el inicio de esa mentalidad en hardware commodity.
Una cita que vale la pena tener pegada sobre la consola, atribuida a James Hamilton: “Everything fails, all the time.” No es cínica; es
un presupuesto de operaciones. Si lo aceptas, diseñarás sistemas que fallen de maneras contenidas. Las protecciones del 386 ayudaron a contener fallos.
Comportamientos de servidor del 386: aislamiento, paginación, multitarea y la realidad del I/O
1) Modo protegido que la gente realmente usó
El 386 no inventó el modo protegido, pero lo hizo habitable. El espacio de direcciones se hizo más grande, el modelo de segmentación dejó de
ser una camisa de fuerza combinado con paginación, y el rendimiento fue suficiente para cargas reales. Para operaciones, el resultado práctico
fue simple: podías tener más de una tarea importante en ejecución, y una de ellas podía fallar sin tomar al resto como rehenes.
Eso cambió el trabajo. De repente “mantenerlo en marcha” era más que “no chocar con la mesa.” Tenías demonios, spoolers, trabajos por lotes,
usuarios, permisos y, finalmente, pilas de red que no asumían un único programa en primer plano.
2) Paginación: la primera vez que una PC pudo fingir tener más RAM (y a veces salir bien parada)
La paginación no es memoria mágica; es dolor diferido. Pero es un tipo de dolor controlado, y el dolor controlado es de lo que vive operaciones.
Con paginación, puedes ejecutar una carga que no cabe del todo en RAM. Sin paginación, simplemente no puedes.
El hardware de paginación del 386 (una historia real de MMU, no un apaño software) permitió a los SO implementar paginación por demanda y swap de una manera
que se comportaba como minicomputadoras y servidores Unix. Este es el momento en que “el disco es lento” se convierte en una afirmación medible en lugar de una sensación.
Broma #1: La paginación es como guardar tus calcetines en el cajón de la cocina—técnicamente tienes más espacio, pero odiarás tus mañanas.
3) Anillos y privilegio: espacio de usuario versus espacio kernel deja de ser filosófico
El modelo de privilegio x86 (anillos 0–3) se volvió operativamente significativo cuando los SO mainstream lo usaron de forma consistente. Las transiciones de anillo, syscalls,
controladores de kernel y procesos de usuario adquirieron responsabilidades más claras. Esto redujo el patrón “un mal puntero destruye el sistema” que dominaba la era DOS.
También creó una clase de fallo completamente nueva: fallos en modo kernel. Cuando el SO se vuelve el jefe, los errores en el jefe duelen de otra manera.
Puedes reiniciar un proceso. Reiniciar el kernel se llama “reboot”, y reboot en producción es una reunión.
4) Modo virtual 8086: compatibilidad sin vivir en el pasado
El 386 introdujo el modo virtual 8086 (v86), permitiendo a SO en modo protegido ejecutar programas DOS en modo real dentro de máquinas virtuales aisladas.
Esto importa porque es la concesión arquitectónica que permitió a las empresas adoptar comportamiento tipo “servidor” sin abandonar su inventario de software existente de la noche a la mañana.
Operativamente, v86 es el antepasado de la jugada de “contener cargas heredadas”: aislar aquello que no puedes reescribir, reducir el radio de impacto
y seguir adelante. ¿Te suena? Los contenedores no inventaron la idea; la hicieron más amigable.
5) El modelo de memoria plana se vuelve plausible: los desarrolladores dejan de pensar en segmentos (casi)
La segmentación no desapareció, pero el 386 hizo práctico el modelo de memoria plana. Para los equipos de ingeniería, eso supuso menos modelos de punteros extraños
y menos trucos de memoria. Para operaciones, significó menos caídas en fallos originados por modelos de memoria que parecían un formulario fiscal.
También facilitó la llegada de Unix y OS similares a hardware PC commodity de una forma que no parecía un proyecto científico.
6) I/O: sigue siendo el villano, ahora con mejores coartadas
El 386 no arregló mágicamente el I/O de las PC. Los discos y controladores tempranos seguían siendo lentos, y la arquitectura del bus no estaba diseñada para
rendimiento multiusuario sostenido. Lo que cambió fue tu capacidad para medir el cuello de botella. Con multitarea y paginación, podías ver la contención:
espera de CPU, colas de disco, cambios de contexto y presión de memoria.
Cuando una máquina puede ejecutar múltiples tareas, también puede ejecutar múltiples decepciones a la vez. Eso también es una característica de servidor.
Hechos históricos que importan en producción
- El 386 fue la primera CPU x86 de 32 bits ampliamente adoptada por Intel, aportando registros de 32 bits y un espacio lineal de direcciones de 4 GiB—enorme comparado con las normas de la época.
- Introdujo la paginación en x86 de una forma que los sistemas operativos mainstream podían usar para memoria virtual y aislamiento de procesos.
- El modo virtual 8086 llegó con el 386, permitiendo ejecutar aplicaciones DOS bajo supervisores en modo protegido con aislamiento.
- El 386DX tenía un bus de datos de 32 bits; el más barato 386SX usaba un bus externo de 16 bits, lo que a menudo significaba rendimiento notablemente peor en memoria e I/O.
- OS/2 2.0 apuntó al hardware de clase 386 para ofrecer características de 32 bits y multitarea mejor que DOS/Windows de la época.
- Los sistemas 386 ayudaron a normalizar Unix en hardware commodity mediante puertos tempranos y la factibilidad general de SO multiusuario en PC.
- La era 386 aceleró la demanda de mejores sistemas de archivos y gestión de discos, porque la paginación y las cargas multiusuario expusieron brutalmente la fragmentación y la latencia de seek.
- Convirtió el concepto de “uptime” en relevante culturalmente para las PC: una vez que las PC ejecutaban servicios continuamente, reiniciar dejó de ser rutinario y pasó a ser arriesgado.
Los modos de fallo que el 386 hizo visibles
La presión de memoria se convierte en un problema de rendimiento, no solo en un bloqueo
En un mundo de tarea única, “sin memoria” es un corte seco. En un mundo con paginación y multitarea, “memoria baja” es un espectro. La máquina se ralentiza,
la latencia se dispara y, finalmente, entras en swap thrash: el sistema hace más I/O de disco moviendo páginas que trabajo útil.
Felicidades, has descubierto el primer incidente de servidor verdaderamente aburrido: aquel en el que nada está caído, pero todos están enfadados.
Inversión de prioridades y sorpresas del planificador
La multitarea implica decisiones de planificación. La planificación significa que tu carga “rápida” puede volverse lenta si compite con lo equivocado en el momento equivocado.
Trabajos por lotes, backups, indexación, colas de impresión—tareas clásicas de servidor de oficina—pueden dejar sin recursos el trabajo interactivo si no las gestionas.
El 386 no inventó esto, pero lo hizo común en las PC.
La calidad del driver se convierte en una dependencia de fiabilidad
Cuando mueves el acceso al hardware detrás del SO, los drivers se convierten en los guardianes. Eso es sano, pero centraliza el riesgo.
Un driver de NIC inestable en un equipo de escritorio es molesto. En una PC que actúa como servidor, es tiempo de inactividad.
Los discos se convierten en el punto único silencioso de fallo
Los “servidores” PC tempranos solían tener a menudo un solo disco, quizás dos si alguien se sentía refinado. La paginación volvió los discos aún más críticos.
Si el disco es lento, la máquina entera es lenta. Si el disco falla, la máquina no está “lenta”, es una historia que contarás en el postmortem.
Broma #2: RAID no es una copia de seguridad, pero es una gran forma de perder tus datos con el doble de confianza.
Tres micro-historias corporativas de la era “PC como servidor”
Micro-historia 1: Un incidente causado por una suposición errónea (paginación “gratuita”)
Una empresa mediana ejecutaba un servicio de archivos e impresión en una torre que gradualmente se había convertido en “el servidor de la oficina.” Era una máquina clase 386
actualizada con más RAM (para la época), y el equipo migró una pequeña aplicación basada en base de datos porque “tiene memoria virtual.”
La suposición: la paginación cubriría cualquier pico y el rendimiento degradaría de forma suave.
El primer mes fue tranquilo. Luego llegó el procesamiento de fin de trimestre. Los usuarios se quejaron de que imprimir tardaba minutos y la interfaz de la base de datos “se congelaba.”
La máquina no estaba técnicamente caída. Simplemente se quedó mirando al vacío mientras el LED de disco permanecía encendido como un indicador de remordimiento.
La persona de operaciones de guardia revisó la CPU y la encontró extrañamente baja. La red estaba bien. La cola del disco era enorme. El servidor había entrado en swap thrash:
el conjunto de trabajo excedía la RAM lo suficiente como para que el sistema siguiera expulsando y recargando las mismas páginas. El equipo había tratado al swap como una red de seguridad.
En realidad, el swap es un precipicio con una barandilla bonita.
La solución no fue ingeniosa. Redujeron la concurrencia durante las ventanas batch, añadieron RAM y—lo más importante—movieron la base de datos a una máquina con discos más rápidos
y separaron el spool de impresión de la carga de la base de datos. También empezaron a medir la presión de memoria como una métrica de capacidad de primera clase.
La lección: la memoria virtual es un mecanismo, no un plan.
Micro-historia 2: Una optimización que salió mal (ajuste de disco que se sabotéo a sí mismo)
Otro equipo ejecutaba un servidor de desarrollo compartido en un 386 con un SO tipo Unix. Los desarrolladores se quejaban de compilaciones lentas.
Alguien concluyó que el problema eran “demasiados logs” y “demasiados syncs.” Ajustaron opciones de montaje del sistema de archivos para velocidad,
redujeron barreras de escritura (para la época, los perillas equivalentes) y desactivaron cierto comportamiento periódico de flush.
Las compilaciones se volvieron más rápidas. La gente celebró. Luego ocurrió un evento de energía—breve, ni siquiera dramático. El servidor volvió con el sistema de archivos que
montaba en gran parte, pero con metadatos corruptos en algunos directorios críticos. El daño fue selectivo: algunos archivos estaban intactos, otros quedaron medio escritos.
Fue el peor tipo de fallo porque parecía éxito hasta que tocabas las partes rotas.
La recuperación tomó días reconstruyendo desde las copias de seguridad disponibles, además de una ronda de arqueología para saber “quién cambió los montajes.”
La motivación original era razonable: reducir la sobrecarga de I/O. El error fue no entender lo que se estaba sacrificando: consistencia ante crash.
El cambio permanente fue de política: cualquier ajuste de rendimiento que afecte la durabilidad requiere una declaración de riesgo por escrito y un plan de reversión.
Además, separaron los artefactos de compilación en un sistema de archivos temporal donde la velocidad importaba más que la persistencia, manteniendo el código fuente y los directorios de usuario
en ajustes más seguros. Compilar más rápido está bien. Recuperar un árbol corrupto no es una cualidad de personalidad que quieras.
Micro-historia 3: La práctica aburrida pero correcta que salvó el día (líneas base de capacidad)
Un departamento financiero ejecutaba una pequeña aplicación de línea de negocio más shares de archivos en una PC 386, luego actualizada pero todavía limitada.
La persona de operaciones—metódica y poco a la moda—llevaba notas semanales: espacio libre en disco, uso de swap, carga media y una breve descripción de lo que “normal” parecía en cierre de mes.
Una semana, los usuarios comenzaron a reportar lentitud intermitente alrededor de la hora del almuerzo. No hubo caídas. No hubo errores obvios.
Las notas de la línea base mostraron un aumento constante en la utilización del disco y un aumento leve pero consistente en actividad de swap-in. Eso era nuevo.
No fue lo bastante dramático para disparar alarmas, porque no había buenas alarmas.
Debido a que tenían líneas base, no adivinaron. Revisaron qué directorios estaban creciendo y encontraron un trabajo de exportación por lotes que se había cambiado para
conservar archivos intermedios adicionales. El espacio en disco aún no estaba agotado, pero la fragmentación y la presión de seek estaban aumentando, y el swap ahora competía con el I/O de exportación.
Arreglaron el trabajo para que limpiara tras sí, movieron las exportaciones a un disco separado y programaron el trabajo pesado fuera de horario. Nadie fuera de operaciones notó la intervención.
Ese es el punto. La práctica aburrida—rastrear líneas base—evitó el apagón en cámara lenta. Las herramientas glamorosas son opcionales; saber qué es “normal” no lo es.
Tareas prácticas: comandos, salidas y decisiones (12+)
Estos son comandos de Linux modernos porque puedes ejecutarlos hoy, y las preguntas subyacentes son las mismas que nos obligó a hacernos la era 386:
¿es CPU, memoria, disco o planificación? Cada tarea incluye la decisión que tomas a partir de la salida.
Tarea 1: Identifica la máquina y el kernel (no depures en la plataforma equivocada)
cr0x@server:~$ uname -a
Linux server 6.5.0-21-generic #21-Ubuntu SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
Qué significa: Versión del kernel y arquitectura. Si pensabas que estabas en x86_64 pero no lo estás, todas las suposiciones de rendimiento cambian.
Decisión: Confirma el kernel y la arquitectura esperados antes de comparar con bases o aplicar guías de ajuste.
Tarea 2: Comprueba topología de CPU y pistas de virtualización
cr0x@server:~$ lscpu | egrep 'Model name|CPU\\(s\\)|Thread|Core|Socket|Virtualization'
CPU(s): 8
Model name: Intel(R) Xeon(R) CPU
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
Virtualization: VT-x
Qué significa: Cuánta paralelismo puedes esperar y si SMT puede sesgar los síntomas de saturación de CPU.
Decisión: Si una carga escala pobremente, puedes limitar hilos o fijar CPU; si está en VM, comprueba vecinos ruidosos.
Tarea 3: Vista rápida de carga y “está saturado”
cr0x@server:~$ uptime
12:41:07 up 37 days, 3:12, 2 users, load average: 7.92, 7.85, 7.10
Qué significa: Un load average cerca o por encima del número de CPUs sugiere contención, pero el load incluye esperas de I/O no interrumpibles.
Decisión: Si la carga es alta, comprueba inmediatamente si es CPU o espera de I/O (tareas siguientes).
Tarea 4: Ver saturación de CPU frente a espera por I/O
cr0x@server:~$ mpstat -P ALL 1 3
Linux 6.5.0-21-generic (server) 01/09/2026 _x86_64_ (8 CPU)
12:41:12 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
12:41:13 AM all 22.10 0.00 4.55 38.60 0.00 0.40 0.00 0.00 0.00 34.35
12:41:14 AM all 19.80 0.00 4.20 41.10 0.00 0.45 0.00 0.00 0.00 34.45
12:41:15 AM all 20.30 0.00 4.10 39.90 0.00 0.50 0.00 0.00 0.00 35.20
Qué significa: Un %iowait alto indica que las CPUs están mayormente esperando almacenamiento. Eso es “la máquina actuando como servidor”: la CPU está ociosa pero el sistema está ocupado.
Decisión: Si %iowait es alto, deja de ajustar CPU e investiga disco y presión de memoria.
Tarea 5: Presión de memoria y swapping de un vistazo
cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 2 81264 48216 61240 418920 12 48 980 2100 820 1430 18 4 34 40 0
2 3 81312 47540 61240 417800 20 56 1100 2500 790 1510 20 4 33 43 0
1 3 81356 47020 61244 417500 18 60 1050 2400 800 1490 19 4 34 43 0
2 2 81400 46900 61248 417200 16 52 990 2250 780 1470 18 4 35 43 0
Qué significa: Valores no nulos en si/so indican actividad de swap; b indica procesos bloqueados; wa indica espera por I/O.
Decisión: Si el intercambio entra/sale persiste, tienes presión de memoria. Reduce el conjunto de trabajo, añade RAM o corrige caches descontroladas.
Tarea 6: Qué está usando memoria (y es cache de archivos o RSS anónimo)
cr0x@server:~$ free -h
total used free shared buff/cache available
Mem: 15Gi 12Gi 110Mi 1.2Gi 2.9Gi 1.1Gi
Swap: 4.0Gi 1.2Gi 2.8Gi
Qué significa: “Available” es el número clave. Disponible bajo con uso de swap sugiere presión real, no solo cache.
Decisión: Si available está consistentemente bajo, planifica cambios de capacidad o reduce servicios hogareños de memoria.
Tarea 7: Ofensores por proceso en memoria y CPU
cr0x@server:~$ ps -eo pid,comm,%cpu,%mem,rss,vsz --sort=-rss | head
2143 java 180.2 42.1 6702100 8123400
1880 postgres 35.0 6.3 1002400 1402100
3012 node 22.4 4.9 780120 1023000
1122 rsyslogd 2.1 0.6 92000 180000
Qué significa: RSS muestra la memoria residente real; VSZ muestra el tamaño virtual. RSS grande + swap = riesgo de rendimiento.
Decisión: Si un proceso domina el RSS, valida sus límites, fugas y si realmente pertenece en ese host.
Tarea 8: Salud del dispositivo de almacenamiento y colas
cr0x@server:~$ iostat -xz 1 3
Linux 6.5.0-21-generic (server) 01/09/2026 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
20.04 0.00 4.22 40.11 0.00 35.63
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
nvme0n1 85.0 120.0 6800.0 9200.0 2.0 8.0 2.30 6.25 8.10 14.30 2.90 80.0 76.7 0.25 98.50
Qué significa: %util cercano al 100% junto con await alto indica que el disco es el cuello de botella.
Decisión: Si el disco está saturado, reduce la concurrencia de I/O, mueve cargas o mejora el almacenamiento. No “optimices CPU”.
Tarea 9: Encuentra qué procesos generan I/O
cr0x@server:~$ sudo iotop -o -b -n 3
Total DISK READ: 45.23 M/s | Total DISK WRITE: 62.10 M/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
2143 be/4 app 12.00 M/s 35.00 M/s 12.50 % 85.00% java -jar service.jar
1880 be/4 postgres 18.00 M/s 10.00 M/s 0.00 % 40.00% postgres: writer process
3012 be/4 app 9.00 M/s 8.00 M/s 0.00 % 22.00% node server.js
Qué significa: IO> muestra tareas que pasan tiempo esperando I/O; SWAPIN muestra presión de memoria contribuyendo al I/O.
Decisión: Si un servicio domina el I/O, revisa patrones de consultas, logging y comportamiento de archivos temporales.
Tarea 10: Confirma espacio en sistema de archivos y presión de inodos
cr0x@server:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 220G 201G 8.5G 97% /
tmpfs 7.8G 1.2G 6.6G 16% /run
cr0x@server:~$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/nvme0n1p2 14576640 14210000 366640 98% /
Qué significa: Discos casi llenos provocan fragmentación, bloqueos de asignación y fallos. Los inodos pueden agotarse antes que los bytes.
Decisión: Si bytes o inodos superan ~85–90% en un servidor ocupado, planifica limpieza y expansión de capacidad de inmediato.
Tarea 11: Identifica los directorios que consumen espacio
cr0x@server:~$ sudo du -xhd1 / | sort -h
0 /bin
1.3G /boot
4.2G /etc
12G /home
28G /var
155G /usr
201G /
Qué significa: Atribución rápida: qué árbol está creciendo.
Decisión: Si /var es grande, revisa logs, spool y bases de datos. Si /home es grande, aplica cuotas o mueve datos.
Tarea 12: Comprueba crecimiento de logs y estado de rotación
cr0x@server:~$ sudo journalctl --disk-usage
Archived and active journals take up 8.0G in the file system.
Qué significa: Los journals ocupando disco son comunes en situaciones de “PC convertida en servidor”—el logging fue una ocurrencia tardía hasta que dejó de serlo.
Decisión: Si los logs no están controlados, establece retención, rota correctamente y envía logs fuera del host si necesitas historial.
Tarea 13: Detecta saturación de red o retransmisiones (el clásico “está lento”)
cr0x@server:~$ sar -n DEV 1 3
Linux 6.5.0-21-generic (server) 01/09/2026 _x86_64_ (8 CPU)
12:42:10 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:42:11 AM eth0 8200.00 7900.00 92000.00 88000.00 0.00 0.00 10.00 92.00
Qué significa: Utilización de interfaz cerca de saturación puede parecer lentitud de aplicación.
Decisión: Si %ifutil está consistentemente alto, mejora la velocidad del enlace, añade NICs o reduce el ruido (compresión, batching).
Tarea 14: Confirma problemas TCP (retransmisiones y presión de backlog)
cr0x@server:~$ netstat -s | egrep -i 'retransmit|listen|overflow' | head
1832 segments retransmitted
0 times the listen queue of a socket overflowed
0 SYNs to LISTEN sockets ignored
Qué significa: Retransmisiones indican calidad de red o congestión; overflow de la cola de escucha indica problemas en el bucle de accept.
Decisión: Retransmisiones altas: inspecciona ruta de red, duplex, MTU y congestión. Overflows: ajusta tasa de accept de la app o backlog.
Tarea 15: Comprueba indicadores de presión del kernel (el “servidor-ismo” moderno)
cr0x@server:~$ cat /proc/pressure/memory
some avg10=28.50 avg60=25.10 avg300=22.05 total=987654321
full avg10=3.10 avg60=2.80 avg300=2.20 total=45678901
Qué significa: PSI muestra tiempo pasado bloqueado por presión de memoria. “full” significa que todas las tareas están atascadas.
Decisión: Si PSI memory “full” es no trivial, trátalo como emergencia de capacidad: reduce carga, añade memoria o mueve cargas.
Tarea 16: Comprueba errores de disco (no “ajustes” sobre hardware fallando)
cr0x@server:~$ dmesg -T | egrep -i 'error|timeout|reset|I/O' | tail
[Thu Jan 9 00:12:14 2026] nvme nvme0: I/O 512 QID 7 timeout, aborting
[Thu Jan 9 00:12:14 2026] nvme nvme0: Abort status: 0x371
[Thu Jan 9 00:12:15 2026] nvme nvme0: resetting controller
Qué significa: Timeouts y resets no son oportunidades de ajuste de rendimiento; son incidentes de hardware.
Decisión: Para. Reduce la carga, migra datos, reemplaza hardware y valida firmware. El rendimiento no vencerá a la física.
Guía de diagnóstico rápido: encuentra el cuello de botella pronto
Cuando una PC se comporta como servidor, falla como servidor: contención, colas y degradación lenta. Tu trabajo es localizar la cola.
Hazlo en orden. No improvises.
Primero: decide si es CPU o espera
- Comprueba la carga:
uptime. Carga alta no prueba saturación de CPU. - Comprueba desglose de CPU:
mpstat 1 3. Si%iowaites alto, no es un problema de CPU.
Interpretación: %usr/%sys altos con bajo idle sugieren CPU. %iowait alto sugiere almacenamiento o swap.
Segundo: decide si la presión de memoria crea I/O
- Comprueba swap:
vmstat 1 5parasi/so. - Comprueba memoria “available”:
free -h. - Comprueba PSI (si está disponible):
cat /proc/pressure/memory.
Interpretación: Actividad persistente de swap o stalls “full” de memoria significa que debes reducir el conjunto de trabajo o añadir RAM. El ajuste de almacenamiento no solucionará esto.
Tercero: demuestra si el almacenamiento está saturado o solo lento
- Comprueba utilización y await del dispositivo:
iostat -xz 1 3. - Atribuye I/O a procesos:
iotop -o. - Valida salud del disco:
dmesg -Tpara resets/timeouts.
Interpretación: %util alto y await alto significa colas; await alto con util moderado puede indicar problemas de firmware, throttling o backend compartido.
Cuarto: revisa la red solo después de descartar CPU/mem/almacenamiento
- Utilización de interfaz:
sar -n DEV 1 3. - Retransmisiones:
netstat -s.
Interpretación: Si las retransmisiones suben, arregla la ruta; no sigas “optimizando” tu app para sobrevivir pérdida de paquetes.
Quinto: confirma colas a nivel de aplicación
- Procesos top:
ps,toppara CPU descontrolada o RSS. - Métricas/logs del servicio: latencia de peticiones, profundidad de colas, queries lentas en BD.
Interpretación: Una vez que los recursos del sistema parecen normales, el cuello de botella suele estar dentro de los locks, pools y backpressure de la aplicación.
Errores comunes: síntoma → causa raíz → solución
1) “La CPU está baja pero todo está lento” → espera de I/O o swap thrash → mide y reduce I/O
Síntoma: Usuarios reportan lentitud; CPU está mayormente idle; load average es alto.
Causa raíz: %iowait alto por saturación de almacenamiento o presión de memoria que causa swap.
Solución: Usa mpstat, vmstat, iostat, iotop. Reduce tareas con I/O intenso en picos, añade RAM, mueve bases/logs a discos más rápidos, limita concurrencia.
2) “Reiniciar lo arregla por un tiempo” → fuga de memoria o explosión de cache → aislar y limitar
Síntoma: Rendimiento degrada en días; reiniciar restaura velocidad.
Causa raíz: RSS creciente (fuga), caches sin límites o fugas de descriptores de archivos que llevan a fallos secundarios.
Solución: Rastrear RSS con ps y métricas del servicio; aplicar límites (systemd, cgroups), arreglar fuga, reiniciar el servicio en horario seguro como control interino.
3) “El disco está 97% lleno y ocurren cosas raras” → presión del asignador y fragmentación → liberar espacio y separar cargas
Síntoma: Errores aleatorios de app, escrituras lentas, rotación de logs fallando.
Causa raíz: Espacio libre bajo o agotamiento de inodos; las operaciones de metadatos se vuelven costosas; las escrituras fallan.
Solución: Limpia, aumenta capacidad y mantiene filesystems ocupados por debajo de ~80–85%. Mueve datos volátiles (spool, tmp, artefactos) a volúmenes separados.
4) “Ajustamos por velocidad y perdimos datos” → perillas de durabilidad cambiadas sin evaluar riesgos → restaura valores seguros
Síntoma: Tras crash/pérdida de energía, corrupciones en el sistema de archivos o escrituras recientes ausentes.
Causa raíz: Barreras de escritura deshabilitadas, opciones de montaje inseguras, caches sin protección contra pérdida de energía.
Solución: Revertir a ajustes seguros; poner datos de solo rendimiento en almacenamiento temporal; añadir UPS o almacenamiento con protección ante pérdida de energía si necesitas forzar escrituras.
5) “La red parece inestable solo en este host” → NIC/driver o desajuste duplex/MTU → verifica contadores y logs
Síntoma: Retransmisiones, stalls intermitentes, colapso de throughput bajo carga.
Causa raíz: Enlace malo, MTU incorrecto, bugs de driver o sobrecarga de colas.
Solución: Revisa netstat -s, estadísticas de interfaz, contadores del switch; estandariza MTU/duplex; actualiza driver/firmware.
6) “Las copias de seguridad se ejecutan pero el rendimiento diurno muere” → I/O por lotes mal programado → programar y limitar
Síntoma: A una hora consistente, la latencia se dispara; la espera por I/O salta.
Causa raíz: Backups/indexación/escaneos AV saturan el disco.
Solución: Programa fuera de horas, usa ionice/nice, limita concurrencia y separa el target de backup del disco primario.
Listas de verificación / plan paso a paso
Paso a paso: convertir una “PC servidor” en algo operable
- Inventario de la carga. Lista servicios, horas pico y qué significa “lento” (latencia, throughput, errores).
- Establece una línea base. Captura
uptime,free -h,iostat -xz, uso de disco y procesos top en tiempos “normales” y en pico. - Separa clases de datos. Coloca OS, logs, bases de datos y scratch/tmp en filesystems o volúmenes separados si es posible.
- Aplica límites. Limita memoria y CPU para servicios no críticos para evitar que un bully se coma la máquina.
- Controla trabajos por lotes. Programa backups, indexación y compactación fuera de pico; limita con
nice/ionice. - Define política de reinicios. Los reinicios deben ser planificados, probados y documentados. “Nunca reiniciamos” no es estrategia de resiliencia.
- Valida ajustes de durabilidad. Asegúrate de que los tweaks de rendimiento no deshabilitaron la seguridad. Si no puedes explicar el intercambio, revierte.
- Monitorea las señales correctas. Presión de memoria, utilización/await de disco, tasas de error, retransmisiones—no solo CPU.
- Prueba la restauración. Las copias de seguridad que no se han restaurado son solo optimismo caro.
- Escribe la “guía de diagnóstico rápido”. Tu yo futuro estará cansado y poco impresionado por tus habilidades de improvisación.
Lista de verificación: antes de decir “el hardware es demasiado lento”
- ¿Ves swapping (
vmstat si/so)? - ¿El disco está saturado (
iostat %utilcerca de 100%)? - ¿Hay errores de disco (
dmesgtimeouts/resets)? - ¿El filesystem está casi lleno (
df -hydf -i)? - ¿Hay un trabajo por lotes programado que cause picos periódicos?
- ¿Están subiendo retransmisiones (
netstat -s)? - ¿Tienes una línea base para comparar?
Lista de verificación: si debes exprimir rendimiento de hardware limitado
- Reduce concurrencia antes de reducir la seguridad.
- Prefiere mover escrituras fuera del filesystem crítico antes que volver inseguro el filesystem crítico.
- Añade RAM si el swap está activo; suele ser el cambio con mayor ROI.
- Mantén los discos bajo utilización cómoda; discos llenos son discos lentos.
- Mide después de cada cambio. Si no puedes medirlo, no lo mejoraste—solo lo cambiaste.
Preguntas frecuentes
¿Realmente el 386 “convenció a las PC para que fueran servidores”?
No por sí solo. Pero proporcionó las primitivas de hardware—modo protegido usable, paginación y v86—que permitieron que el comportamiento de clase servidor
se normalizara en las PC. El cambio cultural siguió: multiusuario, servicios de larga vida y responsabilidad operativa.
¿Cuál es la lección operativa más importante de la era 386?
El aislamiento lo cambia todo. Una vez que los fallos pueden contenerse a un proceso, empiezas a diseñar sistemas que esperan fallos y se recuperan de ellos
en lugar de rezar por software perfecto.
¿La paginación siempre es mala?
La paginación es una herramienta. Un poco de paginación puede ser aceptable; swap-in/out sostenido bajo carga es una emergencia de rendimiento.
Si tu servicio principal hace swap regularmente, trátalo como subdimensionado o mal configurado.
¿Por qué a veces el load average sube con la CPU baja?
Porque el load average incluye tareas en sueño no interrumpible, usualmente esperando I/O de disco.
Por eso mpstat e iostat importan más que adivinar.
¿Cuál es el equivalente moderno de “apps DOS bajo v86”?
Ejecutar una carga heredada en una VM o contenedor con límites estrictos. El objetivo es el mismo: compatibilidad sin otorgar a la carga el derecho de tumbar todo el entorno.
¿Cómo distingo si la lentitud es almacenamiento o memoria?
Revisa vmstat por si/so. Si la actividad de swap es persistente, la presión de memoria probablemente está impulsando el I/O.
Luego confirma con free -h y /proc/pressure/memory. Si el swap está tranquilo pero iostat muestra await y util altos, es almacenamiento.
¿Qué debo actualizar primero: CPU, RAM o disco?
Empieza por la evidencia. Si el swap está activo y la memoria “available” es baja, actualiza RAM. Si %util del disco está clavado con await alto, mejora almacenamiento o separa cargas.
Las mejoras de CPU solo ayudan cuando %usr/%sys están consistentemente altos con %iowait bajo.
¿Por qué los filesystems casi llenos causan problemas antes de estar llenos?
Los asignadores tienen menos opciones, la fragmentación crece, el trabajo de metadatos aumenta y las tareas de mantenimiento (como rotación de logs) empiezan a fallar.
Quieres margen operativo, no eficiencia heroica del último byte.
¿“Nunca reiniciar” es buena estrategia de fiabilidad?
No. El mantenimiento planificado vence al fallo sorpresa. Si evitas reinicios por años, no eres estable—estás sin probar.
Programa reinicios, valida la recuperación y guarda el estado en disco con durabilidad adecuada.
¿Cuál es la mejor forma de mantener estable un servidor pequeño con cargas mixtas?
Separa tareas con I/O intenso (logs, backups, scratch) de servicios sensibles a latencia, aplica límites de recursos y programa trabajos por lotes.
La mayoría de desastres en “servidores pequeños” son simplemente contención sin gobierno.
Conclusión: pasos prácticos siguientes
El 386 no fue solo un chip más rápido. Fue el momento en que las PC ganaron disciplina arquitectónica suficiente para soportar sistemas operativos reales con aislamiento real y multitarea real—lo que también significó modos de fallo operativos reales: tormentas de paginación, colas de disco y el desgaste lento de la contención de recursos compartidos. En otras palabras, fue cuando la PC dejó de ser un juguete y empezó a ser tu problema.
Si hoy ejecutas algo que huele a “una máquina que silenciosamente se convirtió en servidor”, haz tres cosas esta semana:
(1) establece líneas base para CPU, presión de memoria y await de disco; (2) separa o limita I/O por lotes; (3) aplica límites para que un servicio no pueda devorar el host. Evitarás el clásico incidente donde nada “se rompe”, pero todo deja de funcionar.