我是这样分析Linux性能问题的

在互联网公司普遍“996”的大环境下,大部分做应用的开发者,大都将精力集中在业务代码的优化和调配上,忽略了对 Linux 内核的学习。而且,这部分知识本身就很复杂,所以学习成本也比较高。

但是,只要你经历过公司业务迅速增长的阶段,就一定遇到过服务稳定性的挑战,比如:TCP 重传该怎么分析,如何在不打断运行任务的情况下排查内存泄漏问题,怎样快速解决 CPU sys 利⽤率过⾼等等。

以上面提到的 TCP 重传为例,服务器上一般都会有 TCP 重传率的监控,如图所示:


像上图中这么高的 TCP 重传率,必然会导致系统 QPS 减小。然而,当你真正去排查时,会发现根本不知从哪里入手。因为网络数据量非常大,只记录 TCP 头部信息也会产生很大存储开销,所以发生重传的现场信息无法被记录下来。

其实,定位类似 TCP 重传这样复杂的稳定性问题,不仅要从开发⼈员的视⻆分析,还要更多从系统、内核的视角出发,这样你才能追本溯源、一劳永逸地解决问题。

而大家之所以觉得这些问题难,本质上还是对 Linux 内核理解不到位。

比如,我接触过的业务开发者,基本都被业务的性能毛刺困扰过,但大多数人只能分析到是哪些系统调用引起的毛刺,而业务专家却可以深入底层,看到引发业务毛刺的系统资源。再比如,当发生 TCP 重传时,有人可以从 tcpdump 里的信息看出是哪个 TCP 连接进行重传,高手们却可以通过这些信息看到为什么会发生重传。

能深入到 Linux 内核分析问题的人,看问题能直击本质,定位、分析问题的能力都更强,往往能解决别人解决不了的问题。

事实上,如果你不是内核开发者,没有必要去搞懂它的每个细节,掌握它的每个机制,只要能通过掌握 Linux 内核知识,解决实际应用层的问题就够了,这也是邵亚方老师和极客时间开设《Linux 内核技术实战课》专栏的初衷,希望能把自己多年的 Linux 内核学习和实践经验,通过“解决问题,满足需求”的方式传递给你。

在专栏中,他从生产环境中 4 类典型问题(Page Cache 管理、内存泄漏、TCP 重传、内核态 CPU 利用率飙高)入手,带你了解:应用程序是怎样跟系统资源打交道的;如何选择业务类型的配置更好;棘手问题出现时该如何一步步排查等等,让 Linux 内核更好地服务你的应用程序。


????扫码免费试读

限时特惠,新人 ¥59.9

再介绍一下专栏作者:邵亚方老师

他是前蘑菇街技术专家,Linux Kernel 活跃贡献者,在 Linux 内核领域深耕了 10 余年,先后在华为、蘑菇街、Juniper Networks 等知名互联网企业从事内核研发工作。

擅长从 Linux 系统内核层⾯来分析解决实际疑难问题、提高业务性能。在华为和蘑菇街,经历了公司从 0 到 1 切换 Linux 或开发部署私有云的过程,通过改造 Linux 内核保障了业务的平滑切换、稳定性和性能;在 Juniper Networks 则一直致力于提升网络性能,保障业务网络的稳定性。

目前主要活跃在 Linux 内核的内存管理子系统(linux-mm),如果你有关注这个邮件列表的话,应该经常能看到他的名字。

他是如何讲解 Linux 内核的?

在专栏中,他结合自己的工作经验,总结出了开发者在生产环境中经常会遇到的四类问题:Page Cache 管理、内存泄漏、TCP 重传、内核态 CPU 利用率飙高。每类问题对应一个模块,按照基础篇、案例篇和分析篇的方式来呈现。

1、Page Cache 管理模块,带你了解如何更好地利用 Page Cache 来减少无谓的 I/O 开销,Page Cache 管理不当会引起的哪些问题,以及怎样分析和解决。

2、内存泄漏模块,重点分析应用程序是如何从系统中申请和释放内存。通过内存泄露这类案例,带你了解应用程序使用内存的细节,以及由内存使用不当而引发问题的解决方案。

3、TCP 重传模块,为你讲解 TCP 连接的建立、传输和断开的过程,分析这个过程究竟会受哪些配置项的影响,以及配置不当会引起的网络问题。从 TCP 重传这类具体案例出发,带你掌握必要的网络细节知识,以及遇到相关问题时,你该如何去分析和解决。

4、内核态 CPU 利用率飙高模块,带你分析应用程序该如何高效使用 CPU,以及哪些情况会导致 CPU 使用低效,比如内核态 CPU 利用率过高等。针对内核态 CPU 利用率高的这个案例,侧重讲解哪些 Linux 内核的特性或系统配置项会引起这种问题,以及怎样分析和解决。

每个模块的最后,都会总结这些常见问题的一般分析思路,让你在面对同类型问题时有一个大致的分析方向。

Linux 底层知识的学习并不是一蹴而就的,但学完这个专栏,相信你不仅可以很好地掌握必备的 Linux 内核基础知识,也能学到很多解决实际问题的技巧,让 Linux 内核真正有效服务于你的应用程序。


最后再强调一下

专栏限时特惠,原价 ¥99,新人 ¥59.9

一次订阅,永久有效,扫码免费试读⬇️

????点击「阅读原文」,最低 ¥59.9 入手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题(49)—— 有符号数与无符号数

void foo(void) {unsigned int a 6;int b -20;(a b> 6)?(">6"):("<6"); } 上面代码输出是什么&#xff0c;为什么&#xff1f; 答案是“>6”原因是当操作数中有符号类型和无符号类型进行运算时所有的操作数都自动转换成无符号数。

Java访问修饰符(访问控制符)

Java 通过修饰符来控制类、属性和方法的访问权限和其他功能&#xff0c;通常放在语句的最前端。例如&#xff1a; 1. public class className { 2. // body of class 3. } 4. private boolean myFlag; 5. static final double weeks 9.5; 6. protected static final int BOXWI…

随便聊聊,Linux 中的环境变量

大家好&#xff0c;今晚说点简单的。环境变量环境变量在进行linux开发过程中经常碰到&#xff0c;那什么是环境变量呢&#xff1f;很多朋友在刚学习Linux的时候对环境变量不是特别理解&#xff0c;变量不应该是在编程语言中类似于全局变量和局部变量吗&#xff1f;怎么又来了个…

什么MySQL语句在存储过程体中是合法的

什么MySQL语句在存储过程体中是合法的&#xff1f; 什么样的SQL语句在Mysql存储过程中才是合法的呢&#xff1f;你可以创建一个包含INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的语句。你唯一需要记住的是如果代码中包含MySQL扩充功能&#xff0c;那么代码将不能移…

IntelliJ IDEA使用教程(很全)

这个编辑器我就不再多做介绍了。直接开始新建maven hello world 的Java web项目啦 你电脑上得有jdk1.7&#xff0c;或者1.8&#xff0c;然后就是maven3.x吧&#xff0c;再有就是tomcat7以上吧。还得有我这个编辑器。这些是准备条件 下面就直接开始看图啦&#xff1a; 这个我刚刚…

每日一题(50)—— 各类型与零值的比较

分别给出BOOL&#xff0c;int&#xff0c;float&#xff0c;指针变量 与“零值”比较的 if 语句&#xff08;假设变量名为var&#xff09; 解答&#xff1a;    BOOL型变量&#xff1a;if(!var)    int型变量&#xff1a; if(var0)    float型变量&#xff1a; …

U-Boot之代码调试

“ 让调试U-Boot不再困难”本文介绍U-Boot的两种调试方法&#xff0c;一种是基于代码级别&#xff0c;另外一种是基于工具进行在线调试。01—DEBUG宏U-Boot自带DEBUG宏&#xff0c;打开该宏定义之后&#xff0c;会增加许多的内在打印信息供开发人员参考。这个宏定义的开关可以通…

Python中 sys.argv[]的用法

调用解释器时&#xff0c;脚本名和附加参数传入一个名为 sys.argv 的字符串列表。通过执行 import sys可以获取这个列表,sys.argv[0] 表示脚本的名字&#xff0c;sys.argv[1] 代表第一个输入参数&#xff0c;sys.argv[2] 代表第二个输入参数&#xff0c;以此类推。如&#xff1…

IT夫妻语录

&#xff29;&#xff34;夫妻语录 亲爱的&#xff0c;最近我发现你情绪低落&#xff0c;反应速度大大降低&#xff0c;是不是头脑里碎片太多&#xff1f;   男&#xff1a;我也说不清楚&#xff0c;我觉得越来越与同事不兼容了。   女&#xff1a;也许这与你和他们配置有关…

每日一题(51)—— 大小端判断

请写一个C函数&#xff0c;若处理器是Big_endian的&#xff0c;则返回0&#xff1b;若是Little_endian的&#xff0c;则返回1。 int checkCPU() {{union w{ int a;char b;} c;c.a 1;return (c.b 1);} } 分析&#xff1a;嵌入式系统开发者应该对Little-endian和Big-endian模…

Android初学第21天

Android初学第21天 09_LayoutsAndWidgets 代码 SignleFragmentActivity.java package com.bignerdranch.android.criminalintent;import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.…

快两年的时间,我都干了啥

‍‍‍‍大家好,我是写代码的篮球球痴这是一篇总结性的文章&#xff0c;主要是总结这一年多快两年的时间&#xff0c;我都在做了些什么。公司名字我就不说了&#xff0c;知道的人一眼就知道了。我们是一家智能家居的公司。提到智能家居&#xff0c;就一定会涉及网关&#xff0c…

每日一题(52)—— 进程

列举几种进程的同步机制&#xff1a; 1&#xff09;原子操作 2&#xff09;信号量机制 3&#xff09;自旋锁 4&#xff09;管程&#xff0c;会合&#xff0c;分布式系统 网络编程中设计并发服务器&#xff0c;使用多进程与 多线程 &#xff0c;请问有什么区别&#xff1f;…

ioremap,你应该知道的事

因为现在使用是dts来表示板级&#xff0c;也就是machine&#xff0c;所以现在我们在内核使用内核映射使用的函数是of_iomap。c代码&#xff1a;struct device_node *node NULL;unsigned int irq_info[3] { 0, 0, 0 };u32 phys_base;switch (idx) {case 0:node of_find_node_…

牙痛,肿成阴阳脸

成阴阳脸:-( 明天见不了客户了&#xff0c;犯愁。好在台湾的朋友非常热情&#xff0c;晚上还安排最好的牙医林先生在诊所等我&#xff1b;又有另一朋友送我神奇的东南亚牙膏。

.NET 二维码生成(ThoughtWorks.QRCode)

引用ThoughtWorks.QRCode.dll &#xff08;源代码里有&#xff09; 1、简单二维码生成及解码代码&#xff1a; //生成二维码方法一private void CreateCode_Simple(string nr) { QRCodeEncoder qrCodeEncoder new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode QRCodeEnc…

如何向开源社区奉献代码

从事嵌入式工作, 日常就是与u-boot, linux这些开源代码打交道, 将自己的代码提交到主线, 将是一件快乐而又能提升逼格的事情. 有些比较新的代码会使用github进行bug追踪, pr合并, 这些直接在github提交Pull Request就好了, 比较简单, 就不在赘述. 本文重点介绍如何使用mail lis…

每日一题(53)—— 评价代码片段

评价下面代码片段&#xff1a; unsigned int zero 0; unsigned int compzero 0xFFFF; /*1s complement of zero */ 对于一个int型不是16位的处理器为说&#xff0c;上面的代码是不正确的。应编写如下&#xff1a; unsigned int compzero ~0; 这一问题真正能揭露出应试者是…

TCP三次握手及四次挥手详解

此篇文章转载自&#xff1a;http://justim.blog.51cto.com/740099/237548TCP(Transmission Control Protocol) 传输控制协议TCP是主机对主机层的传输控制协议&#xff0c;提供可靠的连接服务&#xff0c;采用三次握手确认建立一个连接:位码即tcp标志位,有6种标示:SYN(synchron…

zxing二维码的生成与解码(C#)

ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括&#xff1a;J2ME、J2SE和Android。 首先&#xff0c;在其官网http://code.google.com/p/zxing/上去下载源码 编译在其cshar…