极客时间-左耳听风-程序员攻略-Linux系统、内存和网络
程序员练级攻略:Linux系统、内存和网络
Linux 系统相关
- Red Hat Enterprise Linux 文档 。
- Linux Insides ,GitHub 上的一个开源电子书,其中讲述了 Linux 内核是怎样启动、初始化以及进行管理的。
- LWN’s kernel page ,上面有很多非常不错的文章来解释 Linux 内核的一些东西。
- Learn Linux Kernel from Android Perspective ,从 Android 的角度来学习 Linux 内核,这个站点上的 Blog 相对于前面的比较简单易读一些。
- Linux Kernel Doc
- Kernel Planet ,Linux 内核开发者的 Blog,有很多很不错的文章和想法。
- Linux Performance and Tuning Guidelines ,这是 IBM 出的红皮书,虽然有点老了,但还是非常值得一读的。
- TLK: The Linux Kernel ,这是一本相对比较老的书了,Linux 内核版本为 2.0.33,但了解一下前人的思路,也是很有帮助的。
- Linux Performance ,这个网站上提供了和 Linux 系统性能相关的各种工具和文章收集,非常不错。
- Optimizing web servers for high throughput and low latency ,这是一篇非常底层的系统调优的文章,来自 DropBox,从中你可以学到很多底层的性能调优的经验和知识。
内存相关
LWN.net 上有一系列的 “What every programmer should know about memory” ,完整的 PDF 文档。
下面是这个系列文章的网页版列表,内存知识体系。
- Part 1: Introduction ,中译版为 “每个程序员都应该了解的内存知识【第一部分】”
- Part 2: CPU caches
- Part 3 (Virtual memory)
- Part 4 (NUMA systems)
- Part 5 (What programmers can do - cache optimization)
- Part 6 (What programmers can do - multi-threaded optimizations)
- Part 7 (Memory performance tools)
- Part 8 (Future technologies)
- Part 9 (Appendices and bibliography)
和内存相关的论文,做一些程序的性能优化方面。
- Memory Barriers: a Hardware View for Software Hackers。内存的读写屏障是线程并发访问共享的内存数据时,从程序本身、编译器到 CPU 都必须遵循的一个规范。有了这个规范,才能保证访问共享的内存数据时,一个线程对该数据的更新能被另一个线程以正确的顺序感知到。在 SMP(对称多处理)这种类型的多处理器系统(包括多核系统)上,这种读写屏障还包含了复杂的缓存一致性策略。这篇文章做了详细解释。
- A Tutorial Introduction to the ARM and POWER Relaxed Memory Models,对 ARM 和 POWER 的宽松内存模型的一个教程式的简介。本篇文章的焦点是 ARM 和 POWER 体系结构下多处理器系统内存并发访问一致性的设计思路和使用方法。与支持较强的 TSO 模型的 x86 体系结构不同,ARM 和 POWER 这两种体系结构出于对功耗和性能的考虑,使用了一种更为宽松的内存模型。本文详细讨论了 ARM 和 POWER 的模型。
- x86-TSO: A Rigorous and Usable Programmer’s Model for x86 Multiprocessors,介绍 x86 的多处理器内存并发访问的一致性模型 TSO。
内存管理方面的 lib 库。目前而言,BSD 的 jemalloc 有很大的影响力。
- ptmalloc 是 glibc 的内存分配管理。
- tcmalloc 是 Google 的内存分配管理模块,全称是 Thread-Caching malloc,基本上来说比 glibc 的 ptmalloc 快两倍以上。
- jemalloc 是 BSD 提供的内存分配管理。其论文为 A Scalable Concurrent malloc(3) Implementation for FreeBSD,这是一个可以并行处理的内存分配管理器。
关于 C 的这些内存分配器,可以参看 Wikipedia 的 “C Dynamic Memory Allocation”这个词条。
下面是几篇不错的文章,感觉一下上面那三种内存分配器的一些比较和工程实践。
- ptmalloc,tcmalloc 和 jemalloc 内存分配策略研究
- 内存优化总结:ptmalloc、tcmalloc 和 jemalloc
- Scalable memory allocation using jemalloc
- Decreasing RAM Usage by 40% Using jemalloc with Python & Celery
计算机网络
网络学习
《计算机网络(第五版)》,这本中有很多细节。全书按照网络协议模型自下而上(物理层、数据链路层、介质访问控制层、网络层、传输层和应用层)有系统地介绍了计算机网络的基本原理,并结合 Internet 给出了大量的协议实例。
这本书还与时俱进地引入了最新的网络技术,包括无线网络、3G 蜂窝网络、RFID 与传感器网络、内容分发与 P2P 网络、流媒体传输与 IP 语音,以及延迟容忍网络等。另外,本书针对当前网络应用中日益突出的安全问题,用了一整章的篇幅对计算机网络的安全性进行了深入讨论,而且把相关内容与最新网络技术结合起来阐述。这本书读起来并不枯燥,因为其中有很多小故事和小段子。
两个网上的教程和讲义也可以让人入门。
- 渥汰华大学的一个课程讲义你也可以一看 Computer Network Design 。
- GeeksforGeeks 上也有一个简单的 Computer Network Tutorials 。
网络调优
实用的可以操作的技术。
- 《Linux 的高级路由和流量控制 HowTo》(Linux Advanced Routing & Traffic Control HOWTO ),这是一个非常容易上手的关于 iproute2、流量整形和一点 netfilter 的指南。
- 关于网络调优,你可以看一下这个文档 Red Hat Enterprise Linux Network Performance Tuning Guide。
- 还有一些网络工具能够帮上你的大忙,这里有一个网络工具的 Awesome 列表 Awesome Pcap Tools ,其中罗列了各种网络工具,能够让你更从容地调试网络相关的程序。
- Making Linux TCP Fast ,一篇非常不错的 TCP 调优的论文。
- 下面是在 PackageCloud 上的两篇关于 Linux 网络栈相关的底层文章。
网络协议
读 RFC 有几个好处,一方面可以学习技术,另一方面,你可以通过 RFC 学习到一个好的技术文档是怎么写的,还能看到各种解决问题的方案和思路。
对于第 2 层链路层,需要了解一下 ARP:
以及 Tunnel 相关的协议:
- RFC 1853 - IP in IP Tunneling
- RFC 2784 - Generic Routing Encapsulation (GRE)
- RFC 2661 - Layer Two Tunneling Protocol “L2TP”
- RFC 2637 - Point-to-Point Tunneling Protocol (PPTP)
对于第 4 层,最需要了解的是 TCP/IP 。《TCP 的那些事儿(上)》和《TCP 的那些事儿(下)》两篇文章。
- RFC 793 - Transmission Control Protocol - 最初的 TCP 标准定义,但不包括 TCP 相关细节。
- RFC 813 - Window and Acknowledgement Strategy in TCP - TCP 窗口与确认策略,并讨论了在使用该机制时可能遇到的问题及解决方法。
- RFC 879 - The TCP Maximum Segment Size and Related Topics - 讨论 MSS 参数对控制 TCP 分组大小的重要性,以及该参数与 IP 分段大小的关系等。
- RFC 896 - Congestion Control in IP/TCP Internetworks - 讨论拥塞问题和 TCP 如何控制拥塞。
- RFC 2581 - TCP Congestion Control - 描述用于拥塞控制的四种机制:慢启动、拥塞防御、快重传和快恢复。后面这个 RFC 被 RFC 5681 所更新。还有 RFC 6582 - The NewReno Modification to TCP’s Fast Recovery Algorithm 中一个改进的快速恢复算法。
- RFC 2018 - TCP Selective Acknowledgment Options - TCP 的选择确认。
- RFC 2883 - An Extension to the Selective Acknowledgement (SACK) Option for TCP - 对于 RFC 2018 的改进。
- RFC 2988 - Computing TCP’s Retransmission Timer - 讨论与 TCP 重传计时器设置相关的话题,重传计时器控制报文在重传前应等待多长时间。也就是经典的 TCP Karn/Partridge 重传算法。
- RFC 6298 - Computing TCP’s Retransmission Timer - TCP Jacobson/Karels Algorithm 重传算法。
经典论文《Congestion Avoidance and Control》。
关于 Linux 下的 TCP 参数,TCP 的 man page 。
对于第 7 层协议,HTTP 协议是重点要学习的。
《HTTP 权威指南 》,这本书有点厚,可以当参考书来看。这本书中没有提到 HTTP/2 的事,但是可以让你了解到 HTTP 协议的绝大多数特性。
HTTP 1.1 的原始 RFC 是 1999 年 6 月的 RFC 2616,但其在 2014 后很快被下面这些 RFC 给取代了。
- RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing
- RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
- RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests
- RFC 7233 - Hypertext Transfer Protocol (HTTP/1.1): Range Requests
- RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching
- RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication
关于HTTP/2,这是 HTTP 的一个比较新的协议,它于 2015 年被批准通过,现在基本上所有的主流浏览器都默认启用这个协议。所以,你有必要学习一下这个协议。下面是相关的学习资源。
- Gitbook - HTTP/2 详解
- http2 explained(中译版)
- HTTP/2 for a Faster Web
- Nginx HTTP/2 白皮书
- HTTP/2 的两个 RFC:
- RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2) ,HTTP/2 的协议本身
- RFC 7541 - HPACK: Header Compression for HTTP/2 ,HTTP/2 的压缩算法
Wikipedia 的 Internet Protocol Suite 上看看,这是一个很不错的网络协议的词条汇集地。