**不需要了解每个组件的所有实现细节**,只要能理解它们最基本的工作原理和协作方式
![](https://img.kancloud.cn/2a/27/2a2746c2606518df20c414c046273aa0_3000x2100.png)
大部分性能分析和优化都会包含的知识:
分类 | 原理 | 性能指标 | 性能剖析 | 调优方法
---- | ---- | ---- | ---- | ----
文件系统 | 虚拟文件系统、文件系统I/O栈、文件系统缓存、文件系统种类 | 容量、IOPS、缓存命中率 | df、strace、vmstat、sar、perf、proc 文件系统 | 文件系统选型、利用文件系统缓存、I/O 隔离
Linux 内核 | 内核态 | | BPF、perf、proc 文件系统 | 内核选项
应用程序 | | 吞吐量、响应时间、资源使用率 | | USE 方法(使用率、饱和度、错误)、进程剖析(进程状态、资源使用率、I/O 剖析、系统调用、热点函数、动态追踪)、APM(逻辑简化、编程语言、算法调优、非阻塞 I/O、利用缓存与缓冲区、异步处理并发、垃圾回收)
架构设计 | | | | 空间换时间(缓存、缓冲区、冗余数据)、时间换空间(压缩编码、页面交换)、并行处理(多线程、多进程、分布式)、异步处理(异步 I/O、消息队列、事件通知)
性能监控 | | | | 时间序列分析(历史趋势分析、性能模型构建、未来趋势预测)、服务调用追踪(服务调用流程跟踪、服务调用性能分析、服务调用链拓扑展示)、数据可视化(趋势图、散点图、热图、饼图)、告警通知(阈值选择、报警策略、通知阈值)
性能测试 | | | | 明确需求(系统资源需求、应用程序需求)、环境假设(合理的假设、生产环境模拟、生产负载模拟)、性能测试(基准测试、负载测试、压力测试)、结果分析(应用程序瓶颈、数据库瓶颈、系统资源瓶颈)
CPU | 进程与线程、CPU调度、中断系统、CPU缓存、NUMA | 平均负载、CPU 使用率(用户CPU、系统CPU、IOWAIT、软中断、窃取CPU、客户CPU)、上下文切换(自愿上下文切换、非自愿上下文切换)、CPU缓存命中率 | top/ps、vmstat、mpstat、sar、pidstat、strace、perf、execsnoop、proc 文件系统 | CPU绑定、进程CPU资源限制、进程优先级调整、中断负载均衡、CPU缓存、NUMA优化
内存 | 地址空间、虚拟内存、内存分配与回收、缓存与缓冲区、SWAP | 系统内存使用量、进程内存使用量、缓存与缓冲区命中率、SWAP使用量 | tree、top、sar、vmstat、cachestat、cachetop、memleak、proc 文件系统 | 减少SWAP使用、减少动态内存分配、优化NUMA、 限制进程内存资源、使用HugePage
网络 | 网络配置、TCP / IP 协议、网络收发流程、高级路由、网络QoS、网络防火墙、C10K与C100K | 吞吐量(BPS、QPS、PPS)、延迟、丢包、TCP 重传 | ethtool、sar、ping、netstat/ss、ifstat、ifconfig、tcpdump、wireshark、iptables、traceroute、ipcontrack、perf | 网卡调优(MTU、队列长度、链路聚合)、协议调优(HTTP、TCP、Overlay)、资源控制(QoS)、内核调优(NAT调优、功能卸载、负载均衡、DPDK)
磁盘 IO | 磁盘管理、磁盘类型、磁盘接口、磁盘I/O栈 | 使用率、IOPS、吞吐量、IOWAIT | dstat、sar、iostat、pidstat、iotop、iolatency、blktrace、fio、perf | 系统调用、I/O资源控制、充分利用缓存、RAID、I/O隔离
- 空白目录
- 精简版Spring的实现
- 0 前言
- 1 注册和获取bean
- 2 抽象工厂实例化bean
- 3 注入bean属性
- 4 通过XML配置beanFactory
- 5 将bean注入到bean
- 6 加入应用程序上下文
- 7 JDK动态代理实现的方法拦截器
- 8 加入切入点和aspectj
- 9 自动创建AOP代理
- Redis原理
- 1 Redis简介与构建
- 1.1 什么是Redis
- 1.2 构建Redis
- 1.3 源码结构
- 2 Redis数据结构与对象
- 2.1 简单动态字符串
- 2.1.1 sds的结构
- 2.1.2 sds与C字符串的区别
- 2.1.3 sds主要操作的API
- 2.2 双向链表
- 2.2.1 adlist的结构
- 2.2.2 adlist和listNode的API
- 2.3 字典
- 2.3.1 字典的结构
- 2.3.2 哈希算法
- 2.3.3 解决键冲突
- 2.3.4 rehash
- 2.3.5 字典的API
- 2.4 跳跃表
- 2.4.1 跳跃表的结构
- 2.4.2 跳跃表的API
- 2.5 整数集合
- 2.5.1 整数集合的结构
- 2.5.2 整数集合的API
- 2.6 压缩列表
- 2.6.1 压缩列表的结构
- 2.6.2 压缩列表结点的结构
- 2.6.3 连锁更新
- 2.6.4 压缩列表API
- 2.7 对象
- 2.7.1 类型
- 2.7.2 编码和底层实现
- 2.7.3 字符串对象
- 2.7.4 列表对象
- 2.7.5 哈希对象
- 2.7.6 集合对象
- 2.7.7 有序集合对象
- 2.7.8 类型检查与命令多态
- 2.7.9 内存回收
- 2.7.10 对象共享
- 2.7.11 对象空转时长
- 3 单机数据库的实现
- 3.1 数据库
- 3.1.1 服务端中的数据库
- 3.1.2 切换数据库
- 3.1.3 数据库键空间
- 3.1.4 过期键的处理
- 3.1.5 数据库通知
- 3.2 RDB持久化
- 操作系统
- 2021-01-08 Linux I/O 操作
- 2021-03-01 Linux 进程控制
- 2021-03-01 Linux 进程通信
- 2021-06-11 Linux 性能优化
- 2021-06-18 性能指标
- 2022-05-05 Android 系统源码阅读笔记
- Java基础
- 2020-07-18 Java 前端编译与优化
- 2020-07-28 Java 虚拟机类加载机制
- 2020-09-11 Java 语法规则
- 2020-09-28 Java 虚拟机字节码执行引擎
- 2020-11-09 class 文件结构
- 2020-12-08 Java 内存模型
- 2021-09-06 Java 并发包
- 代码性能
- 2020-12-03 Java 字符串代码性能
- 2021-01-02 ASM 运行时增强技术
- 理解Unsafe
- Java 8
- 1 行为参数化
- 1.1 行为参数化的实现原理
- 1.2 Java 8中的行为参数化
- 1.3 行为参数化 - 排序
- 1.4 行为参数化 - 线程
- 1.5 泛型实现的行为参数化
- 1.6 小结
- 2 Lambda表达式
- 2.1 Lambda表达式的组成
- 2.2 函数式接口
- 2.2.1 Predicate
- 2.2.2 Consumer
- 2.2.3 Function
- 2.2.4 函数式接口列表
- 2.3 方法引用
- 2.3.1 方法引用的类别
- 2.3.2 构造函数引用
- 2.4 复合方法
- 2.4.1 Comparator复合
- 2.4.2 Predicate复合
- 2.4.3 Function复合
- 3 流处理
- 3.1 流简介
- 3.1.1 流的定义
- 3.1.2 流的特点
- 3.2 流操作
- 3.2.1 中间操作
- 3.2.2 终端操作
- 3.3.3 构建流
- 3.3 流API
- 3.3.1 flatMap的用法
- 3.3.2 reduce的用法
- 3.4 collect操作
- 3.4.1 collect示例
- 3.4.2 Collector接口