Linux內核技术
文章平均质量分 94
Linux內核技术
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
20 分析篇 | 如何分析CPU利用率飙高问题 ?
这节课的内容,对于应用开发者和运维人员而言是有些难度的。之所以讲这些有难度的内容,就是希望可以拓展分析问题的边界。这节课的内容对内核开发者而言基本都是基础知识,如果看不太明白,说明对内核的理解还不够,需要花更多的时间好好学习它。现在回顾一下这节课的重点:strace 工具是应用和内核的边界,如果是一名应用开发者,并且想去拓展分析问题的边界,那就需要去了解 strace 的原理,还需要了解如何去分析 strace 发现的问题;ftrace 是分析内核问题的利器,需要去了解它;原创 2023-11-12 23:16:08 · 139 阅读 · 0 评论 -
19 案例篇 | 网络吞吐高的业务是否需要开启网卡特性呢?
我们来简单回顾一下这节课的重点:硬中断、软中断以及 ksoftirqd 这个内核线程,它们与用户线程之间的关系是相对容易引发业务抖动的地方,需要掌握它们的观测方式;硬中断对业务的主要影响体现在硬中断的发生频率上,但是它也容易受线程影响,因为内核里关中断的地方有很多;软中断的执行时间如果太长,就会给用户线程带来延迟,需要避免你的系统中存在耗时较大的软中断处理程序。如果有的话,需要去做优化;原创 2023-11-12 22:10:03 · 50 阅读 · 0 评论 -
18 案例篇 | 业务是否需要使用透明大页:水可载舟,亦可覆舟?
回顾一下这节课的要点:细化 CPU 利用率监控,在 CPU 利用率高时,需要查看具体是哪一项指标比较高;sysrq 是分析内核态 CPU 利用率高的利器,也是分析很多内核疑难问题的利器,需要去了解如何使用它;THP 可以给业务带来性能提升,但也可能会给业务带来严重的稳定性问题,最好以 madvise 的方式使用它。如果不清楚如何使用它,那就把它关闭。原创 2023-11-12 22:04:39 · 41 阅读 · 0 评论 -
17 基础篇 | CPU是如何执行任务的?
总结一下这节课的知识点:要想明白 CPU 是如何执行任务的,首先需要去了解 CPU 的架构;CPU 的存储层次对大型软件系统的性能影响会很明显,也是在性能调优时需要着重考虑的;高并发场景下的 Cache Line 伪共享问题是一个普遍存在的问题,需要留意一下它;系统中需要运行的线程数可能大于 CPU 核数,这样就会导致线程排队等待 CPU,这可能会导致一些延迟。如果你的任务对延迟容忍度低,可以通过一些手段来人为干预 Linux 默认的调度策略。原创 2023-11-12 21:54:44 · 101 阅读 · 0 评论 -
16 套路篇 | 如何分析常见的TCP问题?
我们讲了 TCP 问题分析的惯用套路,再次强调一下这节课的重点:尽量不要使用 netstat 命令,而是多使用它的替代品 ss,因为 ss 的性能开销更小,运行也更快;当你面对网络问题一筹莫展时,可以考虑使用 tcpdump 抓包看看,当系统中的网络连接数较大时,它对系统性能会产生比较明显的影响,所以你需要想办法避免它给业务带来实质影响;TCP Tracepoints 是比较轻量级的分析方案,需要去了解它们,最好试着去用一下它们。原创 2023-11-12 21:34:32 · 72 阅读 · 0 评论 -
15 分析篇 | 如何高效地分析TCP重传问题?
在“开篇词”中举过一个 TCP 重传率的例子,如下图所示:这是互联网企业普遍都有的 TCP 重传率监控,它是服务器稳定性的一个指标,如果它太高,就像上图中的那些毛刺一样,往往就意味着服务器不稳定了。那 TCP 重传率究竟表示什么呢?其实 TCP 重传率是通过解析 /proc/net/snmp 这个文件里的指标计算出来的,这个文件里面和 TCP 有关的关键指标如下:TCP 重传率的计算公式如下:也就是说,单位时间内 TCP 重传包的数量除以 TCP 总的发包数量,就是 TCP 重传率。原创 2023-11-12 21:02:33 · 1359 阅读 · 0 评论 -
14 案例篇 | TCP端到端时延变大,怎样判断是哪里出现了问题?
我们这堂课以典型的 C/S 架构为例,分析了 RT 发生抖动时,该如何高效地识别出问题发生在哪里。我来总结一下这节课的重点:tcpdump 是分析网络问题必须要掌握的工具,但是用它分析问题并不容易。在你不清楚该如何分析网络问题时,你可以先使用 tcpdump 把现场信息保存下来;TCP 是数据流,如何把 TCP 流和具体的业务请求 / 响应数据包关联起来,是分析具体应用问题的前提。你需要结合你的业务模型来做合理的关联;RT 抖动问题是很棘手的,需要结合你的业务模型来开发一些高效的问题分析工具。原创 2023-11-12 20:44:12 · 149 阅读 · 0 评论 -
13 案例篇 | TCP拥塞控制是如何导致业务性能抖动的?
TCP 拥塞控制是一个非常复杂的行为,在这节课里讲到的内容只是其中一些基础部分,希望这些基础知识可以让你对 TCP 拥塞控制有个大致的了解。总结一下这节课的重点:网络拥塞状况会体现在 TCP 连接的拥塞窗口(cwnd)中,该拥塞窗口会影响发送方的发包行为;接收方的处理能力同样会反馈给发送方,这个处理是通过 rwnd 来表示的。rwnd 和 cwnd 会共同作用于发送方,来决定发送方最大能够发送多少 TCP 包;原创 2023-11-12 19:40:55 · 117 阅读 · 0 评论 -
12 基础篇 | TCP收发包过程会受哪些配置项影响?
TCP/IP 是一个很复杂的协议栈,它的数据包收发过程也是很复杂的,我们这节课只是重点围绕这个过程中最容易引发问题的地方来讲述的。我们刚才提到的那些配置选项都很容易在生产环境中引发问题,并且也是我们针对高性能网络进行调优时必须要去考虑的。把这些配置项也总结为了一个表格,方便查看:这些值都需要根据你的业务场景来做灵活的调整,当不知道针对你的业务该如何调整时,最好去咨询更加专业的人员,或者一边调整一边观察系统以及业务行为的变化。原创 2023-11-12 19:33:15 · 591 阅读 · 0 评论 -
11 基础篇 | TCP连接的建立和断开受哪些系统配置影响?
这节课我们讲了很多的配置项,把这些配置项汇总到了下面这个表格里,方便记忆:当然了,有些配置项也是可以根据服务器负载以及 CPU 和内存大小来做灵活配置的,比如 tcp_max_syn_backlog、somaxconn、tcp_max_tw_buckets 这三项,如果物理内存足够大、CPU 核数足够多,可以适当地增大这些值,这些往往都是一些经验值。另外,这堂课的目的不仅仅是为了去了解这些配置项,最主要的是想了解其背后的机制,这样在遇到一些问题时,就可以有一个大致的分析方向。原创 2023-11-12 19:23:39 · 79 阅读 · 0 评论 -
10 分析篇 | 内存泄漏时,我们该如何一步步找到根因?
这节课我们讲述了系统性分析 Linux 上内存泄漏问题的分析方法,要点如下:top 工具和 /proc/meminfo 文件是分析 Linux 上内存泄漏问题,甚至是所有内存问题的第一步,我们先找出来哪个进程或者哪一项有异常,然后再针对性地分析;应用程序的内存泄漏千奇百怪,所以你需要掌握一些通用的分析技巧,掌握了这些技巧很多时候就可以以不变应万变。但是,这些技巧的掌握,是建立在你的基础知识足够扎实的基础上。你需要熟练掌握我们这个系列课程讲述的这些基础知识,熟才能生巧。原创 2023-11-12 18:46:03 · 301 阅读 · 0 评论 -
09 分析篇 | 如何对内核内存泄漏做些基础的分析?
这节课我们讲了一种更难分析以及引起危害更大的内存泄漏:内核内存泄漏。我们还讲了针对这种内存泄漏的常用分析方法:可以通过 /proc/meminfo 里面的信息来看内核内存的使用情况,然后根据这里面的信息来做一些基本的判断:如果内核太大那就值得怀疑;kmemleak 是内核内存分析的利器,但是一般只在测试环境上使用它,因为它对性能会有比较明显的影响;在生产环境中可以使用 tracepoint 或者 kprobe,来追踪特定类型内核内存的申请和释放,从而帮助我们判断是否存在内存泄漏。原创 2023-11-11 23:58:36 · 152 阅读 · 0 评论 -
08 案例篇 | Shmem:进程没有消耗内存,内存哪去了?
这节课,我们学习了 tmpfs 这种类型的内存泄漏以及它的观察方法,这种类型的内存泄漏和其他进程内存泄漏最大的不同是,很难通过进程消耗的内存来判断是哪里在泄漏,因为这种类型的内存不会体现在进程的 RES 中。但是,如果熟悉内存问题的常规分析方法,就能很快地找到问题所在。在不清楚内存被谁消耗时,可以通过 /proc/meminfo 找到哪种类型的内存开销比较大,然后再对这种类型的内存做针对性分析。原创 2023-11-11 23:15:22 · 266 阅读 · 0 评论 -
07 案例篇 | 如何预防内存泄漏导致的系统假死?
这节课讲了什么是内存泄漏,以及内存泄漏可能造成的危害。对于长时间运行的后台任务而言,它存在的内存泄漏可能会给系统带来比较严重的危害,所以我们一定要重视这些任务的内存泄漏问题。内存泄漏问题是非常容易发生的,所以我们需要提前做好内存泄漏的兜底工作:即使有泄漏了也不要让它给系统带来很大的危害。长时间的内存泄漏问题最后基本都会以 OOM 结束,所以需要去掌握 OOM 的相关知识,来做好这个兜底工作。原创 2023-11-11 21:24:37 · 104 阅读 · 0 评论 -
06 基础篇 | 进程的哪些内存类型容易引起内存泄漏?
这节课我们讲述进程内存管理相关的一些知识,包括进程的虚拟内存与物理内存,要点如下。进程直接读写的都是虚拟地址,虚拟地址最终会通过 Paging(分页)来转换为物理内存的地址,Paging 这个过程是由内核来完成的。进程的内存类型可以从 anon(匿名)与 file(文件)、private(私有)与 shared(共享)这四项来区分为 4 种不同的类型,进程相关的所有内存都是这几种方式的不同组合。原创 2023-11-11 21:11:10 · 58 阅读 · 0 评论 -
05 分析篇 | 如何判断问题是否由Page Cache产生的?
在前面几节课里,我们讲了 Page Cache 的一些基础知识,以及如何去处理 Page Cache 引发的一些问题。这节课我们来讲讲,如何判断问题是不是由 Page Cache 引起的。我们知道,一个问题往往牵扯到操作系统的很多模块,比如说,当系统出现 load 飙高的问题时,可能是 Page Cache 引起的;也可能是锁冲突太厉害,物理资源(CPU、内存、磁盘 I/O、网络 I/O)有争抢导致的;也可能是内核特性设计缺陷导致的,等等。原创 2023-11-11 21:00:59 · 45 阅读 · 0 评论 -
04 案例篇 | 如何处理Page Cache容易回收引起的业务性能问题?
我们在前一篇讲到了 Page Cache 回收困难引起的 load 飙高问题,这也是很直观的一类问题;在这一篇讲述的则是一类相反的问题,即 Page Cache 太容易被回收而引起的一些问题,这一类问题是不那么直观的一类问题。对于很直观的问题,我们相对比较容易去观察分析,而且由于它们比较容易观察,所以也相对能够得到重视;对于不直观的问题,则不是那么容易观察分析,相对而言它们也容易被忽视。外在的特征不明显,并不意味着它产生的影响不严重,就好比皮肤受伤流血了,我们知道需要立即止血这个伤病也能很容易得到控制。原创 2023-11-11 20:14:47 · 95 阅读 · 0 评论 -
03 案例篇 | 如何处理Page Cache难以回收产生的load飙高问题?
这节课我们讲的这几个案例都是内存回收过程中引起的 load 飙高问题。关于内存回收这事,我们可以做一个形象的类比。我们知道,内存是操作系统中很重要的一个资源,它就像我们在生活过程中很重要的一个资源——钱一样,如果你的钱(内存)足够多,那想买什么就可以买什么,而不用担心钱花完(内存用完)后要吃土(引起 load 飙高)。原创 2023-11-11 12:16:25 · 124 阅读 · 0 评论 -
02 基础篇 | Page Cache是怎样产生和释放的?
主要讲了 Page Cache 是如何“诞生”的,以及如何“死亡”的,强调几个重点:Page Cache 是在应用程序读写文件的过程中产生的,所以在读写文件之前你需要留意是否还有足够的内存来分配 Page Cache;Page Cache 中的脏页很容易引起问题,要重点注意这一块;在系统可用内存不足的时候就会回收 Page Cache 来释放出来内存,我建议你可以通过 sar 或者 /proc/vmstat 来观察这个行为从而更好的判断问题是否跟回收有关。原创 2023-11-11 12:01:55 · 116 阅读 · 0 评论 -
01 基础篇 | 如何用数据观测Page Cache?
我记得很多应用开发者或者运维在向我寻求帮助,解决 Page Cache 引起的问题时,总是喜欢问我 Page Cache 到底是属于内核还是属于用户?应用程序产生Page Cache的逻辑示意图通过这张图片可以清楚地看到,红色的地方就是 Page Cache,很明显,Page Cache 是内核管理的内存,也就是说,它属于内核不属于用户。那咱们怎么来观察 Page Cache 呢?原创 2023-11-11 11:02:36 · 64 阅读 · 0 评论 -
如何让Linux内核更好地服务应用程序?
在你遇到有些疑惑的地方,或者你觉得 Linux 内核哪里不够好时,你可以大胆地去质疑它,去向精通 Linux 内核的人求助,或者向 Linux 社区求助,正是因为你的这些需求,我们才能把 Linux 内核建设的更好更强大。业务增长了,随之而来的肯定就是服务的稳定性挑战了,比如 TCP 重传该怎么分析、怎么在运⾏时不打断任务的情况下排查内存泄漏问题、CPU sys 利⽤率⾼怎么快速解决,这都是实实在在的问题,你会就会,不会就是不会。不可否认,如果想系统学习 Linux 内核,成本是非常高的。原创 2023-11-11 10:57:24 · 44 阅读 · 0 评论