自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 Linux源码-进程描述符

在单CPU多进程并发的场景下,单位时间内一个CPU同一时刻只会执行一个进程的代码,比如在1秒中内,CPU的时间周期被切割成100个分片,同时有10个进程需要执行,且每个进程之间的优先级都是相同的情况下,每个进程被分配到的时间就在10个时间分片,同时这10个时间分片不一定是连续的。创建进程时,首先会创建PCB,根据PCB中的信息对进程实施有效管理。//通过进程描述符,指向线程组的组长。task_state_index为内联函数,用于计算给定任务结构体task_struct的状态索引,明确一个进程的具体状态。

2024-06-29 16:25:21 504

原创 源码学习:文件描述符

在进程描述学习中,扯到了max_fds,接着就联想到了日常运维中常见的ulimit参数、sysctl内核参数,原来以为max_fds与这些个关联性比较强,但经过一早上折腾以后,发现其实还是有一些差距的。但是在学习过程中,却是东拉西扯折腾出了很多其他东西。现在尝试把这些东西都统一消化一下。

2024-06-29 16:15:09 956

原创 Linux软中断学习

因为它们的运作方式与上文描述的中断类似,但完全是用软件实现的,所以称为软中断(software interrupt)或soft irq是完全符合逻辑的。软中断有守护进程,软中断守护进程的任务是,与其余内核代码异步执行软中断。函数open_softirq()用来注册看软中断的处理函数,在软中断向量表中为制定的软中断编号设置处理函数,同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区。软中断和小任务不允许睡眠,工作队列是使用内核线程实现的,处理函数可以睡眠。

2024-01-13 18:23:13 414

原创 99%的人都不知道内存充足情况下也会触发OOM!

1台48C256GB的Intel x86服务器(开了超线程,实际为2个物理CPU,24core),在上面创建了两个虚拟机,每个虚拟机为提高性能,采用了vCPU绑核的方式进行了绑定,每个物理CPU(24C中配置23C)对应一个虚拟机。虽然两个虚拟机分别绑定了两个不同的内存NODE,但是除了虚拟机之外,操作系统上还有其他的openstack进程和系统进程也会使用内存,而且分布可能不均衡,因此在长期的运行下,随着内存实际使用率越来越高,最终触发了OOM。那么问题来了,为什么明明内存足够,缺无法分配?

2024-01-13 18:22:12 1108

原创 99%的人都不知道的ssh访问缓慢原因

接到小伙伴信息,说生产有一台sftp的服务器,近期用户在使用sftp的时候发现登录时间特别慢,从输入用户名密码后到login成功,期间会有4-8秒左右的等待时间。此外使用su命令和ssh命令的时候都存在类似问题。需要协助一起排查一下。耳听为虚,眼见为实。登录服务器,瞬间就感觉到了的确很慢,光登录等待就花了6秒左右。结合问题描述的现象,首先开始三板斧。#vmstat 1 观察30秒。

2023-12-30 20:47:18 1504

原创 perf分析工具

perf是内置与Linux内核源码树中的性能剖析工具。基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标和操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位。系统级性能优化分为两个阶段:性能剖析和代码优化。通过perf,应用程序可以利用PMU、TracePoint和内核中的计数器来进行性能统计。#perf#perf list -->查看当前系统支持的性能事件perf bench -->针对系统性能进行摸底perf test -->针对系统进行健全性能测试。

2023-10-29 09:57:01 315

原创 小米14发布会上的技术思维和产品思维

技术思维和产品思维的受众群体和需要展现的内容

2023-10-29 09:49:53 343

原创 Day46-回顾页面分配-慢速路径

【欢迎关注微信公众号:qiubinwei-1986】在一边学习一边总结学习的过程中,自身也在不断调整自己的学习方式,状态,工具,期待能够以一种最佳的学习状态进入来提升效率和能力。不过感觉到目前为止还没找到。为了能够更清晰的理解各个函数之间的调用关系,特地搞了一个processon的在线工具,可以实现脑图和流程图的结合,感觉还是有点效果。比单纯的贴代码要好多了,至少增加了一个自己思考的过程。

2023-09-09 19:29:59 90

原创 DAY47-内存水位管理和分配优先级

页面分配器的zone水位管理流程如下:1)当zone的空闲内存大小高于高水位线时,zone的空闲页面比较充足,页面分配器处于快速路径上2) 当zone空闲页面的水位达到了低水位时,若分配不成功,则进入慢速路径。页面分配器中的快速和慢速路径是以低水位线能否成功分配为分界线的。3)在慢速路径上,首先会唤醒kswapd内核线程,异步扫描LRU链表和回收页面(kswapd一般一个numa节点会启一个线程)4)若在慢速路径上分配失败,则会进行如下多种尝试。

2023-09-09 19:27:19 104

原创 DAY48-虚拟内存管理之进程管理

【欢迎关注微信公众号:qiubinwei-1986】​乘着周六有时间,终于可以完成的把进程的虚拟内存管理这块从头到尾学下来,各类函数比较多,只能做到先mark,知其然。所以然照例还是等C语言学的差不多了再回过来学习。

2023-09-09 19:25:24 44

原创 eBPF程序开发与执行

bpf_trace_printk()是一个最常用的 BPF 辅助函数,它的作用是输出一段字符串。第 4) 处的 open_perf_buffer 定义了名为 “events” 的 Perf 事件映射,而后通过一个循环调用 perf_buffer_poll 读取映射的内容,并执行回调函数输出进程信息。第 4) 处的 open_perf_buffer 定义了名为 “events” 的 Perf 事件映射,而后通过一个循环调用 perf_buffer_poll 读取映射的内容,并执行回调函数输出进程信息。

2023-09-09 19:20:58 163

原创 泛读Linux内核观测技术BPF-02

整个第二章从编写一个BPF程序开始,先介绍BPF程序编译执行的过程,大致分C语言编写,LLVM编译成BPF字节码,在通过bfp调用变成BPF字节码,通过BPF验证器后使用JIT编译为机器码并执行。SO_REUSEADDR和SO_REUSEPORT都是内核中的端口重用参数(TCP和UDP),允许相同主机上多个进程绑定相同的端口,解决在高并发情况下,多线程并发处理时端口不足的问题,打开端口重用可以提高网络连接数量,获得较高单机性能。通过不同的程序类型,可以将程序附加到内核网络处理的不同阶段上。

2023-09-09 19:18:49 241

原创 泛读Linux内核观测技术BPF-01

【欢迎关注微信公众号:qiubinwei-1986】9月开始了,前期定的关于eBPF的相关计划,由于学习难度和成本太高了,一直处于翻开书就放弃阶段,直到近期,在外部压力下迫使自己不得不临时放下Linux内核的学习,通过代价高昂的上下文切换,过渡到Linux的eBPF学习上。由于BPF手上的纸质文档有限,计划先花1周左右时间,先把如下这本书泛读一遍,加深印象,在通过有的放矢的方式针对其中对现阶段最有价值的内容进行深入学习。这本书带上引言,一共八章,相比较Linux内核的板砖材料,这本书基本就是小儿科了。

2023-09-09 19:17:47 220

原创 Day45-回顾vmalloc()

在接口函数调用时,驱动往往会调用__vmalloc()函数, 在__vmalloc中会调用__vmalloc_node_range()VMALLOC_START: 是vmalloc区域的开始地址,以内核模块区域的结束地址为起始点。VMALLOC_END: vmalloc区域的结束地址。vmalloc()源码解析。vmalloc()概览。

2023-08-21 22:18:00 35

原创 Day44-回顾slab分配器

kmem_cache数据结构是slab分配器中的核心数据结构,成为slab描述符。定义在//对象的实际大小 unsigned int size;//对象的长度,该长度已经加上对齐字节 unsigned int align;//对齐的长度 slab_flags_t flags;//对象的分配掩码 unsigned int useroffset;//usercopy区域的偏移量 unsigned int usersize;//usercopy区域的大小 const char *name;

2023-08-20 20:31:36 53

原创 Day41-回顾物理内存管理

欢迎关注微信公众号:qiubinwei-1986​。

2023-08-19 19:00:37 29

原创 Day42-回顾伙伴系统

欢迎关注微信公众号:qiubinwei-1986​。

2023-08-19 18:58:37 33

原创 Day43-回顾页面分配-快速路径

在释放内存时,会检查相邻的内存块是否空闲,如果空闲,就将其合并成一个大的内存块,放置到高一阶的空闲链表中。如果还能继续合并邻近的内存块,就会继续合并,转移到更高阶的空闲链表中,这个过程会不断重复执行,知道所有可能的合并的内存块都合并完成。在Linux内核在分配物理页面时,发现没有办法分配出想要的物理内存,特别是大内存块,那么他会去从其他迁移类型中挪用内存(通过__rmqueue_fallbackh函数),此时就可以认为系统存在外碎片化倾向。外碎片化指系统有足够的空闲内存,但是没有办法分配出想要的内存块。

2023-08-19 18:55:35 24

原创 systemd的daemon-reload导致系统卡顿问题分析

关注微信公众号:百万年薪运维工程师成长手札。

2023-07-18 08:38:21 2122 1

原创 DAY17-进程复习02

PID_MAX_LIMIT则是限制pid的上限,如果编译内核时设置了CONFIG_BASE_SMALL选项,则最大值就是 8 * PAGE_SIZE个大小,否则就看long数据类型的的大小,如果大于4,则最大可以设置4 * 1024 * 1024个(4194304个),否则最大值只能设置PID_MAX_DEFAULT。为了能够处理这种情况,内核服务被设计为可重入的,允许多个进程介入并使用所需的服务。当进程产生一个新的线程时,新的子进程将获得唯一的pid,但是继承了父线程的tgid,因为属于同一个线程组。

2023-07-18 07:48:01 49 1

原创 DAY16-进程知识点复习

fork函数,一次调用,两次返回,面试

2023-07-09 20:39:05 30 1

原创 DAY15-进程管理API详解01

有句话说的好,“linux源码解读涉及到的代码的每个单词我都认识,但是合到一起就不认识了”,心中一直是希望能够把源码好好学一下,但是由于大学没有学过汇编和C,起点比较低,暂时也没什么好的方法在这块突破。昨天刚说了,人生会有很多意外。本周乘明天休息,得把这两周通过视屏和数据学习的进程方面的内容好好梳理一把,做一些总结,在进程这块,还有15天的时间,把几本Linux内核的书的目录再翻一下,把进程剩余的一些再整体突击学一下。今天的学习内容比较简单,大致如下,4个API函数,后续可以自己写一些C的进程来调用一下。

2023-07-09 20:34:56 30 1

原创 DAY14-多核调度分析

Linux内核将同一个级别的CPU归纳为一个调度组,把同一个级别的调度组归纳为一个调度域,处理器有一个基本的调度域,他是硬件线程调度域,向上依次是核调度域、处理器调度域和NUMA节点调度域。Linux内核按照处理器拓扑层次划分为调度域层次,每个调度域包含多个调度组,调度组和调度域关系。1、SMP是多核处理器最常见的,主要是将一个计算机上集中一组处理器,各处理器是对等使用系统总线和内存子系统。Linux内核把所有同一个级别的CPU归纳为一个调度组,然后把同一个级别的调度组成一个调度域。

2023-07-09 20:34:03 361 1

原创 DAY13-Linux内核内存布局

vmemmap: 内存的物理地址,如果不连续的话,就会存在内存空洞(稀疏内存), vmmemmap就是用来存放稀疏内存的page结构体的数据的虚拟地址空间。mmap()向操作系统申请一段虚拟地址空间(使用映射到某个文件),当不用此空间来映射到某个文件时,这块空间称为匿名空间,可以用来作为堆空间。AnonPages: 75508 kB //未映射页的内存/映射到用户空间的非文件页表大小。brk()是系统调用,实际是设置进程数段的结束地址,将数据段的结束地址向高地址移动。

2023-07-09 20:33:09 350 1

原创 DAY12-内存屏障

内存屏障,也称内存栅障或屏蔽指令等,是一类同步屏障指令,是编译器或CPU对内存访问操作的时候,严格按照一定顺序来执行,也就是memory barrier之前的指令和memory barrier之后的指令不会由于系统优化等原因而导致乱序。在代码编译时,指令一般不会按照源程序的顺序执行,原因是为提高程序执行性能,会对他进行优化,主要为两种:编译器优化和CPU执行优化。A. 编译器编译代码时可能重新排序汇编指令,使编译出来的程序在处理器上执行速度更快,但是有的时候优化的结果可能不符合软件开发工程师的意图。

2023-07-05 12:45:53 36 1

原创 DAY10-进程优先级与调度策略

SCHED_OTHER: 不支持优先级使用,而SCHED_RR/SCHED_FIFO支持优先级使用,他们分别为1-99, 数值越大,优先级越高。普通调度策略(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE),始终返回0,即普通任务调度的函数。//获取实时优先级的最大值。//获取实时优先级的最小值。

2023-07-05 12:43:01 63 1

原创 DAY11-RCU机制

RCU的意思就是读-复制-更新,他是根据原理命名,写着修改对象的流程为:首先复制生成一个副本,然后更新此副本,最后使用新对象替换旧的对象。1.RCU重要的应用场景是链表,有效的提高遍历读取数据的效率,读取链表成员数据时通常只需要rcu_read_locak(),允许多个线程同时读取链表,而且允许一个线程同时修改链表。RCU记录所有指向共享数据的指针的使用者,当要修改改共享数据时,首先创建一个副本,在副本修改。RCU能保护的不仅是一般的指针。有关通过RCU保护的链表,优势在于可使用标准的链表元素,。

2023-07-05 12:42:15 170 1

原创 Day9-实时调度类及SMP和NUMA

实时进程与普通进程根本不同之处,如果系统中有一个实时进程且可执行,那么调度器总是会选择它,除非有一个优先级更高的实时进程。实时调度提sched_rt_entity数据结构,表示实时调度实体,包含整个实时调度数据信息。某个CPU上无可运行进程,__schedule()准备调度idle进程前,会尝试从其他CPU上拉一批进程过来。SMP优势:当前使用的OLTP程序当中,用户访问中心数据库,如果采用SMP系统,它的效率要比MPP架构要快。在多处理器系统中,内核必须考虑几个额外的问题,主要以确保良好的调度。

2023-07-03 23:07:16 87 1

原创 Day8-进程调度器

在实际当中,必然会有进程优先级高或者进程优先级低,CFS调度器引入权重,使用权重代表进程的优先级,各个进程按照权重比例分配CPU时间,SCHED_RR: 实时进程调度策略,采用时间片轮转方法,进程使用完时间片之后加入优先级对应运行队列的尾部,把CPU让给同等优先级的其他进程。在一个调度周期里面,所有进程的虚拟运行时间是相同的,所以在进程调度时,只需要找到虚拟运行时间最小的进程调度运行即可。停机调度类:优先级最高的调度类,停机进程是优先级最高的进程,可以抢占所有其他进程,其他进程不可能抢占停机进程。

2023-07-02 16:02:42 90 1

原创 Day7-进程切换

2)在进程发出了某些系统调用而操作系统暂时无法完成,需要选择其他进程来执行。例如,发出read系统调用进程读文件数据时,如果数据不在页缓冲区中,则需要切换进程。进程切换的本质是暂停当前进程转而去执行新切入进程,需要完成当前进程的现场保存和切入进程的现场恢复。5)操作系统从进程B的PCB中恢复进程B在内核态下的现场信息,并切换内核栈。2)在异常处理程序中,操作系统将进程A在用户态下的现场信息保存到内核栈中。4)操作系统将进程A在内核态下的现场信息保存到进程A的PCB中。7)进程B从内核态返回用户态。

2023-07-02 15:58:30 66 1

原创 Day6-系统调用

Linux存在用户空间和内核空间,同样的CPU也划分系统调用(System Call)是用户态程序使用内核态服务的接口。需要注意的是,系统调用是在用户态和内核态之间进行切换的开销比较大的操作,因此在设计应用程序时需要谨慎使用系统调用,并尽量减少不必要的系统调用次数,以提高程序的性能。第一,把用户从底层的硬件编程中解放出来,与具体的硬件完全隔离,用户不需要面向具体的硬件编码,降低了开发的复杂度和难度。内核维护系统调用表,保存系统调用函数的起始位置,系统调用号对应该系统调用在调用表中的偏移量。

2023-07-02 15:57:45 37 1

原创 Day4-进程属性

创建完init进程之后,进程0会执行cpu_idle()函数,当某个cpu的就绪队列无需要执行的进程,处于闲置状态,会通过调度器去执行进程0,并让该cpu进入空闲状态,即此时通过top或者mpstat或者iostat看到的cpu的使用率为0。linux内核在启动时会有一个init_task进程,他是系统中所有进程的祖先,叫做0号进程或者idle进程或者swapper进程,pid为0,他是在内核代码之中。今天开展第二部分的内容学习,关于进程属性,由于白天比较忙,能够用来深入学习的时间,只能草草了事了T_T。

2023-07-02 15:55:40 26 1

原创 Day5-进程控制原语

而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。如“进程终止”内的描述,当一个进程终止自己的时候,其实它并没有真正的被销毁,内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等,但是留下一个称为僵尸进程的数据结构,这个结构保留了一定的信息(包括进程号 the process ID,退出状态,运行时间),并且会发送给父进程,当父进程通过 wait()/waitpid() 函数进行操作才会释放数据结构,这样设计的目的主要是保证只要父进程想知道子进程结束时的状态信息。

2023-07-02 15:49:11 1048 1

原创 Day3.进程与线程的基本概念

在操作系统的多个进程并发执行过程中,本质上是通过CPU的时间片机制将1秒钟的CPU处理时间进行切片,通过调度算法分配给不同的进程去执行,期间涉及到一个名字,就叫做上下文切换(Context Switching),即指在并发执行情况下,进程A执行了n个CPU时间片以后,需要将进程A状态进行保存,随后换进程B消费m个CPU时间片,其后进程B将自己的执行状态保存后,再切换至进程A恢复到之前保存的状态,继续执行进程A的步骤。最终拍脑袋整合了一下,形成了第二张图,按照自己定义的顺序开展深度学习,时间期限:7天完成。

2023-07-02 15:42:49 36 1

原创 Day2.进程管理1

进程是操作系统调度的一个实体,需要对进程所必须资源做一个抽象化,并反映并发执行的动态特征,因此引入进程控制块(PCB, Process Control Block), PCB是操作系统感知进程存在的唯一实体,在创建一个进程时,操作系统首先会创建PCB,然后根据PCB信息对进程进行管理和控制,在一个进程完成其任务之后,操作系统也会释放其PCB,进程也随之终止。独立运行在内核空间的进程,与普通的用户进程区别在于内核线程没有独立的进程地址空间。限期进程的优先级比实时进程要高,实时进程的优先级比普通进程要高。

2023-07-02 15:42:18 52 1

原创 Day1-Falg+内核发展

传统的内核会将所有的硬件抽象都实现在内核中,这样的内核被称为宏内核(Monolithic Kernel),其中的代表是Linux。基于多内核(Multikernel)的操作系统,机器被视为拥有多个独立CPU核的网络,操作系统被构建为一个分布式系统,一个CPU核(core)对应一个操作系统内核。结果没成想头发还是掉了。08年开始干运维,累积也有15个年头了,一直对Linux内核有着一定的想法,曾经也多次浅尝即止过内核的学习,都因为太难了没学下去。内核的书买了不少,连C语言的书也整了不少,但是效果不佳。

2023-07-02 15:38:28 40 1

原创 Day0-学习计划

学了两天的Linux内核,猛然发现现在的学习完全是凭借着一腔热血,只是拍了一下脑袋,没有任何计划和可持续性。按照对自己的了解,估计最多是一个礼拜的热度就坚持不下去了。而且对于后续的学习计划仍然是云深不知处。所以抽空赶紧列了一个180天的学习计划,来一次先上车后买票。希望到了12月再来回顾,能略有小成。(不懂C语言,真的很吃亏)

2023-07-02 15:37:41 35 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除