文件描述符:一个整数如何连接进程与内核的四十年演进
“Too many open files” 凌晨三点,生产环境的服务器突然告警。Nginx无法接受新连接,应用日志里满是EMFILE错误。运维检查后发现,某个Java进程打开了超过一百万个文件描述符——虽然系统配置允许这样做,但进程的资源限制仍然是默认的1024。 ...
“Too many open files” 凌晨三点,生产环境的服务器突然告警。Nginx无法接受新连接,应用日志里满是EMFILE错误。运维检查后发现,某个Java进程打开了超过一百万个文件描述符——虽然系统配置允许这样做,但进程的资源限制仍然是默认的1024。 ...
一个看似简单的问题 当你在Linux终端输入cp /home/user/file.txt /mnt/usb/backup/时,系统在做什么?源文件位于ext4格式的SSD上,目标目录在FAT32格式的U盘里。这两种文件系统的数据结构完全不同——ext4使用extent树管理块分配,FAT32依靠链式的FAT表。然而,cp命令对这种差异一无所知。 ...
一行代码的千里之行 当你写下 write(1, "Hello, World!\n", 14) 这行代码时,你实际上正在发起一场跨越两个世界的旅行。这行代码将穿越CPU的特权级边界,从你熟悉的用户空间进入神秘的内核空间,完成一次完整的系统调用。 ...
1983年,当Linus Torvalds还在芬兰赫尔辛基大学读书时,Unix系统的中断处理已经发展了二十多年。那时的中断处理程序必须完成所有工作:响应硬件、读取数据、通知进程。这种设计在单处理器、低频率设备时代还算可行,但随着网络速度从10Mbps攀升到100Mbps,再到今天的400Gbps,中断处理的时间预算被压缩到了微秒级。 ...
1982年3月,Bill Joy在BSD开发过程中添加了chroot系统调用,约一年半后随4.2BSD正式发布。这个简单的功能让进程看到一个被重新定义的根文件系统,被认为是现代容器技术的起点。但chroot只是文件系统的隔离,进程仍然共享同一个内核视图,看到相同的进程列表、网络配置和主机名。 ...
2004年,Linux内核开发者面临一个棘手的问题:传统的电梯调度算法在特定工作负载下会导致请求饥饿——某些I/O请求可能永远等不到服务。这个问题的根源在于,当磁盘忙于服务某一方向的请求时,反方向的请求可能被无限期忽略。Jens Axboe设计的Deadline调度器正是为了解决这个问题,它给每个请求设定一个"死线",保证请求不会无限期等待。 ...
一个承载每秒百万级请求的消息队列系统,工程师在技术选型时毫不犹豫地选择了共享内存——因为大家都知道共享内存是最快的IPC机制。三个月后,生产环境出现诡异的数据竞争问题,调试了两周才发现是同步原语使用不当。最终不得不重构,改用消息队列,性能下降了30%,但系统终于稳定了。 ...