Linux性能优化1 - 如何学习Linux性能优化?

88 阅读5分钟

性能优化 —— 程序员的紧箍咒

Linux操作系统可以说是我们最常使用到的服务器操作系统,往往我们的各种组件都是运行在上面,服务器资源是每家企业的重要资产,如何平衡成本和组件性能便成了我们软件工程师需要重点关注的问题。

当我们的应用出现问题,往往会先去定位问题的原因,linux系统的资源使用率往往是一个切入点,比如cpu,memory,disk, network 都是我们需要重点关注的对象。当出现这些问题时,我们往往会查阅大量的linux相关资料,同时会去了解应用使用的语言的内部原理,比如Java应用的JVM相关原理来定位问题产生的原因,然后再借鉴网上的一些解决思路去尝试解决问题。大多数的时候,问题都能得到解决,但是我们往往是一种知其然,不知其所以然的状态,当相同问题的解决方法在自己的环境中不生效时,我们便会陷入深深的迷惘中。

下面的这几种黑暗经历,或许正在看这篇文章的你也遇到过:

  1. 流量高峰期,服务器 CPU 使用率过高报警,你登录 Linux 上去 top 完之后,却不知道怎么进一步定位,到底是系统 CPU 资源太少,还是程序并发部分写的有问题?
  2. 系统并没有跑什么吃内存的程序,但是敲完 free 命令之后,却发现系统已经没有什么内存了,那到底是哪里占用了内存?为什么?
  3. 一大早就收到 Zabbix 告警,你发现某台存放监控数据的数据库主机的 iowait 较高,这个时候该怎么办?

性能优化一直都是大多数软件工程师头上的“紧箍咒”,它涉及了从程序设计、算法分析、编程语言,再到系统、存储、网络等各种底层基础设施的方方面面。

毫无疑问,性能优化是软件系统中最有挑战的工作之一,但是换个角度看,它也是最考验体现你综合能力的工作之一。

所以如何吃透性能优化的各个关键点,便是我们成长为优秀软件工程师的必经之路

如何开始学习性能优化?
一提到性能优化,我们一般会感到无从下手,听到 系统, 底层 这些名词就开始发怵,会感觉性能问题太过于复杂,难以抽丝剥茧。第三方组件的开发语言各不相同,可能是java,py,scala,ruby,我们不可能熟悉每种语言的内部机制,这都使得性能优化成为我们的拦路虎

事实上,我们不需要了解每个组件的所有实现细节,只需要能理解它们最基本的工作原理和协作方式,当我们理解了应用程序和系统的少数几个基本原理,再进行大量的实战练习,建立起整体性能的全局观,大多数性能问题的优化就会水到渠成

学会性能优化的第一步,弄清楚什么是性能指标?
当看到性能指标时,你会首先想到什么呢?我相信“高并发”和“响应快”一定是最先出现 在你脑海里的两个词,而它们也正对应着性能优化的两个核心指标——“吞吐”和“延时”。这两个指标是从应用负载的视角来考察性能,直接影响了产品终端的用户体验。跟它们对应的,是从系统资源的视角出发的指标,比如资源使用率、饱和度等。

image.png

性能问题与性能优化
随着应用负载的增加,系统资源的使用也会升高,甚至达到极限。而性能问题的本质,就是系统资源已经达到瓶颈,但请求的处理却还不够快,无法支撑更多的请求。

性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利 用系统资源处理更多的请求。这包含了一系列的步骤,比如下面这六个步骤。

  1. 选择指标评估应用程序和系统的性能;
  2. 为应用程序和系统设置性能目标;
  3. 进行性能基准测试;
  4. 性能分析定位瓶颈;
  5. 优化系统和应用程序;
  6. 性能监控和告警。

性能优化的第一步 - 抓住重点
想要学习好性能分析和优化,建立整体系统性能的全局观是最核心的话题,因而以下三点是重中之重:

  1. 理解最基本的几个系统知识原理;
  2. 掌握必要的性能工具;
  3. 通过实际的场景演练,贯穿不同的组件。

Linux性能工具全览:

image.png

学习性能优化的两个小技巧
1. 虽然系统的原理很重要,但在刚开始一定不要试图抓住所有的实现细节。
深陷到系统实现的内部,可能会让你丢掉学习的重点,而且繁杂的实现逻辑,很可能会打退 你学习的积极性。 我们要做的是先学会我给你讲的这些系统工作原理,但不要去深究 Linux 内核是如何做到的,而是要把我们的重点放到如何观察和运用这些原理上
2. 边学边实践,通过大量的案例演习掌握 Linux 性能的分析和优化。
3. 勤思考,多反思,善总结,多问为什么。

--- 本文总结于Geek Time Linux相关专栏。