「Linux Performance」- 性能优化(学习笔记)

更新日期:2021年03月01日
@IGNORECHANGE

问题描述

为了学习性能优化,我们购买了 Linux性能优化实战 网课,讲师的技术毋庸置疑,但是该网课只能用作性能优化入门或者引导指路,毕竟篇幅的原因而不能面面具到。在学习的过程中,我们发现我们还有很多欠缺的只是需要学习。

现在,我们需要学习操作系统的性能优化,因此需要学习:
1)系统:操作系统的知识(偏向 Linux 方向);
2)硬件:具备基本的硬件知识、计算机组成原理;
3)网络:基本的网络知识(网络协议与其在 Linux 中的实现)

解决方案

我们的首个解决方法

我们准备好《操作系统原理》《计算机组成原理》《TCP/IP 详解》,做好计划,开始学习。

很显然,这个方案是不可行的。之所以不可行,不是学习内容的问题,而是意志力和知识储备的问题。说到意志力,这几本书可不是随随便便坚持几个月就能看完的。说到知识储备,这基本书又会牵扯比如算法数据结构等等方面的知识。根本就不适合我这种外行。(历史总是在重演嘛,我们不止一次拿起经典著作,看个几页后就放在一边)

简单可行的解决方案

我们从简单的开始,学习简单的操作系统知识,对操作系统有个初步的认识。正巧我们手里有本《30天自制操作系统》,我们可以先写个简单的操作系统,达到对操作系统有个初步的认识,掌握操作系统的基础简单知识。

但是在学习《30天自制操作系统》的过程中,我们发现,需要准备汇编语言的知识,不然看这本书的时候就之剩下抄代码了。所以我们开始看汇编语言的知识《汇编语言(第 3 版)》《x86 汇编语言 从实模式到保护模式》《32 位汇编语言程序设计(第 2 版)》,好在这些书中都提及硬件工作的基本原理(汇编语言本来就是用于操作硬件,如果没有书中没有介绍硬件,那八成不是什么好的汇编教学),因此我们不用再单独去看硬件方面的书籍。

如果相对硬件的原理有个基本的了解,可以阅读《穿越计算机的迷雾(第 2 版)》

# 注意事项 # 该方案中介绍的书籍只是用于简单入门,之后依旧阅读《操作系统原理》《计算机组成原理》《TCP/IP 详解》《Linux 内核设计与实现》等等书籍

因此根据该解决方案,产生以下笔记内容:
1)Assembly Language / Intel 80x86
2)Writing a Simple Operating System

章节内容

该部分笔记开始于 Linux性能优化实战 的学习笔记,然后不断整理性能优化相关的内容。

性能优化学习方法

对于性能优化,需要学习以下内容:
1)基础知识:熟练掌握 计算机原理、操作系统知识、计算机网络 等等知识,熟记于心;
2)排查工具:常用性能工具使用、查看性能指标、定位性能问题;
3)经验总结:总具体的案例中总结经验,抽象出性能排查的一般思路与模式;

熟练掌握”基础原理知识“只是性能优化的开始,这些基础知识盘根错节,任何地方都可能导致性能问题。所以并不是说掌握基础支持就等于掌握性能问题的排查方法。

学习 Linux 性能优化实战

CPU 性能篇 (13讲)

02 | 基础篇:到底应该怎么理解“平均负载”? => Load Average

03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上) => Context switch
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)

05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办? => CPU utilization

06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上) => Linux process states
08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)

09 | 基础篇:怎么理解Linux软中断? => interrupts and softirqs

10 | 案例篇:系统的软中断CPU使用率升高,我该怎么办?

11 | 套路篇:如何迅速分析出系统CPU的瓶颈在哪里? => 01.CPU
12 | 套路篇:CPU 性能优化的几个思路

13 | 答疑(一):无法模拟出 RES 中断的问题,怎么办?
14 | 答疑(二):如何用perf工具分析Java程序?

内存性能篇 (8讲)

15 | 基础篇:Linux内存是怎么工作的?
16 | 基础篇:怎么理解内存中的Buffer和Cache?
17 | 案例篇:如何利用系统缓存优化程序的运行效率?
18 | 案例篇:内存泄漏了,我该如何定位和处理?
19 | 案例篇:为什么系统的Swap变高了(上)
20 | 案例篇:为什么系统的Swap变高了?(下)
21 | 套路篇:如何“快准狠”找到系统内存的问题?

22 | 答疑(三):文件系统与磁盘的区别是什么?

I/O 性能篇 (10讲)

23 | 基础篇:Linux 文件系统是怎么工作的?

24 | 基础篇:Linux 磁盘I/O是怎么工作的(上)
25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)

26 | 案例篇:如何找出狂打日志的“内鬼”?
27 | 案例篇:为什么我的磁盘I/O延迟很高?
28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
29 | 案例篇:Redis响应严重延迟,如何解决?

30 | 套路篇:如何迅速分析出系统I/O的瓶颈在哪里?
31 | 套路篇:磁盘 I/O 性能优化的几个思路

32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系

网络性能篇 (13讲)

33 | 关于 Linux 网络,你必须知道这些(上) => 04.NETWORK
34 | 关于 Linux 网络,你必须知道这些(下)

35 | 基础篇:C10K 和 C1000K 回顾 => C10K and C10M

36 | 套路篇:怎么评估系统的网络性能? => 04.NETWORK

37 | 案例篇:DNS 解析时快时慢,我该怎么办? => dns resolution

38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量? => ping slow tcpdump and wireshark

39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题? => ddos

40 | 案例篇:网络请求延迟变大了,我该怎么办? => networking latency

41 | 案例篇:如何优化 NAT 性能?(上) => NAT - Network address translation

42 | 案例篇:如何优化 NAT 性能?(下) => nat

43 | 套路篇:网络性能优化的几个思路(上) => z.tunning
44 | 套路篇:网络性能优化的几个思路(下)

45 | 答疑(五):网络收发过程中,缓冲区位置在哪里?

综合实战篇 (13讲)

46 | 案例篇:为什么应用容器化后,启动慢了很多?
47 | 案例篇:服务器总是时不时丢包,我该怎么办?(上)
48 | 案例篇:服务器总是时不时丢包,我该怎么办?(下)
49 | 案例篇:内核线程 CPU 利用率太高,我该怎么办?
50 | 案例篇:动态追踪怎么用?(上)
51 | 案例篇:动态追踪怎么用?(下)
52 | 案例篇:服务吞吐量下降很厉害,怎么分析?
53 | 套路篇:系统监控的综合思路
54 | 套路篇:应用监控的一般思路
55 | 套路篇:分析性能问题的一般步骤
56 | 套路篇:优化性能问题的一般方法
57 | 套路篇:Linux 性能工具速查
58 | 答疑(六):容器冷启动如何性能分析?

加餐篇 (4讲)

加餐(一) | 书单推荐:性能优化和Linux 系统原理
加餐(二) | 书单推荐:网络原理和 Linux 内核实现
用户故事 | “半路出家 ”,也要顺利拿下性能优化!
用户故事 | 运维和开发工程师们怎么说?

结束语 (1讲)

结束语 | 愿你攻克性能难关

结课测试 (1讲)

结课测试|这些Linux性能知识你都掌握了吗?

问题排查思路

1)确定负载来源,CPU / IOWAIT

相关链接

brendangregg/perf-tools: Performance analysis tools based on Linux perf_events (aka perf) and ftrace
iovisor/bcc: BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more
Linux Performance

perf is a performance analyzing tool in Linux.
Wikipedia/perf
Linux perf Examples


ToC

问题描述

解决方案

我们的首个解决方法

简单可行的解决方案

章节内容

性能优化学习方法

学习 Linux 性能优化实战

CPU 性能篇 (13讲)

内存性能篇 (8讲)

I/O 性能篇 (10讲)

网络性能篇 (13讲)

综合实战篇 (13讲)

加餐篇 (4讲)

结束语 (1讲)

结课测试 (1讲)

问题排查思路

相关链接