﻿# 阶段 2：第一个瓶颈 — FD 耗尽（Day 4-6）

> **撞上的问题**：试图跑 2000 并发连接时，`accept()` 返回 -1，errno = EMFILE（"Too many open files"）。

## 背景

阶段 1 证明了 Echo 服务在 100 并发下工作正常。现在尝试扩大连接数，这是第一个真正的性能瓶颈。

## 每日概览

| 天 | 主题 | 关键操作 | 产出 |
|:--:|------|------|------|
| Day 4 | [撞上 FD 限制](/demos/echo/day-04/README.md) | 逐步增加连接数，100→500→1000→2000，记录崩溃点 | 崩溃日志、errno 信息 |
| Day 5 | [FD 与 ulimit 深入](/demos/echo/day-05/README.md) | 理解什么是 FD（File Descriptor，文件描述符）、`ulimit -n`、`fs.file-max`、`fs.nr_open`、systemd LimitNOFILE | FD 概念图解、参数对照表 |
| Day 6 | [修复 FD 并验证 10K](/demos/echo/day-06/README.md) | 调高 ulimit 到 1048576，验证 1 万连接稳定 | `scripts/02-ulimit-setup.sh` |

## 问题诊断路径

```bash
连接数 ↗ → accept() 返回 -1 → errno = EMFILE
→ ulimit -n 显示 1024（默认值）
→ 每个 socket 占用一个 FD，1024 扣掉 stdin/stdout/stderr 只剩 ~1021
→ 连接数超出即失败
```

## 完工验证清单

- [ ] `ulimit -n` = 1048576
- [ ] `fs.file-max` ≥ 2097152
- [ ] 1 万连接 5 分钟不崩溃
- [ ] 能解释 FD 是什么、为什么默认 1024、每个连接占用哪些 FD

> **一句话总结**：第一个瓶颈来得很早——1024 个 FD 限制在你试图跑 2000 连接时就炸了，这是理解"操作系统资源限制"的最佳入门课。

