Linux 网络编程
前置条件
- 你以为你不懂多线程多进程文件就敢来碰网络编程?!跑个单线程 epoll 谁不会?连多线程并发控制都不会,客户数据出错了你负责?赶紧 run 去学 Linux 系统编程 吧你。
- 数据结构和算法不会?不会还有人用链表去存所有用户元数据吧,笑死了,别这写低性能服务器了,打好你的基础:数据结构和算法 先吧。
为什么要学习服务器?
当今所有的 IT 行业都需要使用服务器为大量客户提供服务,往往 web 系程序员可以直接使用 Nginx、Apache 等开源的服务器,而我们 C 系程序员的目标是了解服务器的底层原理,服务器是如何撑住“百万并发”,多进程,多线程,协程服务器之间区别是什么,reactor/proactor 模型是什么?epoll 多路 I/O 复用是什么。
然而只明白服务器原理是并不够的。当前工业界往往需要服务器提供某种服务:数据存储也好,缓存也好,P2P 通信也好,它们都属于业务层需要实现的内容。小组同学在大一暑假的时候会接触到如何使用 epoll 简单实现一个聊天室,大概也能明白业务层和网络层之间的区别。
如何学习服务器?
当前最佳的方案是看书和学习(并参与开发)开源项目。如果是 API 上的问题可以 Google 其 man 手册或者去 Stack Overflow 寻找相关问题。
书籍
- 《UNIX 网络编程 第一卷》:看了这个不能让你上天,很多网络模型现在都已经过时了明白么(注意它还没有讲 epoll)?TCP/UDP 必修,三次握手和四次挥手那些也得了解了解,那一堆
setsockopt
的调优不是你能短期内明白的,慢慢看。 - 《图解网络-小林coding-v2.0.pdf》:这种书虽然是那种偏向应付面试官的书,但是用来查缺补漏,学习网络基础,其实也不错。后面还有讲套接字内核参数调优,咱平时可没系统接触。
- 《Linux 高性能服务器编程》:了解下基础的 Linux 网络框架,了解点 epoll,了解点 C++ 风格的服务器编程。
- 《Linux 多线程服务端编程 使用 Muduo C++ 网络库》:陈硕大佬写的精品,之前看了高性能可以让你初步了解服务器,但是这本可以让你把一些服务器编程的精髓搞清楚,人家给你踩的这些多线程网络编程的坑,目前没有更好的一些书可以帮替代。但是 Muduo 也已经过时了!这是 2010 年左右的书!GitHub 有 Muduo 库的 98、11、17 版,别读死书!
你即使把上面这些都搞明白了,还是会感觉自己对服务器的了解局限在 Muduo 教给你的 reactor 模型和回调地狱里面。
少年的征途是星辰大海!
开源项目
- 学习当前流行的开源 web 服务器,如 Nginx、libuv、libevent,钻研其源码。(boost::asio 也可能会比较难读)
- 学习当前流行的开源项目如何使用服务器,例如 Redis 的网络层是如何实现的,深入研究其源码。
自我检验 HOMEWORK
你连 Muduo 都不会抄?还是说你只会抄 Muduo?那和废柴有什么区别?
不会有人认为服务器只能用于 web 吧!
我列了下面这些,你需要学会如何探索相关资料。老师、学长只能教你如何钓鱼,不能替你钓鱼。
- 实现一种通信协议,如 IRC、HTTPS、RPC、DNS...
- 提高性能的方法:
- 实现 web 服务器缓存层(如 memcached、redis)
- 使用 io_uring 进行异步 I/O
- 查找并消除性能瓶颈
- 提供持久性服务:
- 实现 web 服务器存储层(如 Haystack)
- 实现 web 服务器的容错服务...
如何进行调试
- 使用 gdb(例如如何在多线程中设置断点)
- 使用 Valgrind(如何检测内存越界,检测线程竞争)
- 使用 AddressSanitizer(同上)
如何构建项目
- 使用 CMake
- 使用 Bazel
- 使用 xmake
如何进行测试
- 编写自己的单元测试,例如使用 Google Test
- 使用 Postman 进行测试(适用于 web 服务器)
- 编写客户端进行测试
- 使用 ab 进行压力测试(适用于 web 服务器)
如何进行性能优化
- 使用服务器性能测试工具(如 ab)进行性能测试,与 Nginx 等开源实现进行比较。
- 使用性能分析工具(如 Perf、gperftools、eBPF...)分析服务器的热点,确定服务器的性能瓶颈,例如不必要的字符串拷贝、耗时的系统调用,或者是否需要禁用 TCP 的 Nagle 算法?还要了解 QPS、吞吐量和延迟的概念。
如何部署
- 使用 Docker:你的服务器只能在本地运行吗?在云时代,连 Docker 都不会用?
后续学习方向
好了,你的服务器总算比屎好一点了。但如果客户要求你存储 TB 级别的数据,你难道还会使用文件存储吗?学习数据库可以让你了解服务器可以提供哪些服务,学习分布式系统可以了解如何扩展服务器的容量和性能,以及如何提供容错性。
- 数据库
- 分布式系统