cgroup限制读写速率
0-前言
经常存在需要模拟用户场景下的性能测试,模拟的一个方式就是构造特定带宽的io,而fio、dd等等io测试工具是不具备限制读写速度的功能的,所以这里就要用到cgroup的能力,这里记录一下如何限制特定进程、盘符的读写能力。
1-安装工具&创建组
首先要安装group工具
yum install libcgroup-tools
然后用cgroup工具创建一个iocgroup组
cgcreate -g blkio:/iotest
如果创建成功后,
inux中断-硬中断
0、前言
中断子系统有一次大改造,先mark一下
https://lore.kernel.org/all/20200521200513.656533920@linutronix.de/
arm64参考:Linux 中断管理机制
1、概述
广义上的中断主要分为同步中断和异步中断两种
* 同步(
virto虚拟化
1-背景
在完全虚拟化中,CPU会发生VM entry和VM exit事件,从而满足不同权限级别的事件。在虚拟机执行IO事件时,会频繁发生entry和exit事件而影响虚拟机性能。
virtio这种软件模拟的半虚拟化技术,就可以避免上述这种问题。virtio的核心是利用virtqueue的方式传输数据,而不是标准io中操作特定寄存器的方式。
2-virtio协议
virtio的本质是一个前后端结构,其提供一种虚拟化场景的子机(guest)与母机(host)之间的通讯接口。在子机内是作为前端驱动存在,
内核链表
1-背景
链表是最最常用的数据结构之一,在c语言中没有cpp stl中那些可以动态申请的各种容器,所以链表是非常常用的用来动态分配的数据结构。
内核中也定义了一些基础的api,用来实现链表的各种操作,并且这些基础api也是经过了多年的维护、优化,最大程度的保障了性能以及安全。
在这片文章里总结、记录一下内核链表api的操作吧。
比较有趣的是,这些内核链表的api几乎都是linus 19年前实现的代码,这么多年一直没人修改或者说不必修改。
2-数据结构
内核定义了一个标准的基础链表数据结构list_head
struct
kdump调试
1-背景
kdump是linux用来分析crash问题的一种手段,在内核发生crash后,会主动启动第二内核,将当前内存中的所有状态转存至本地文件vmcore中。
但是有些服务器总是无法正常生产vmcore,我们这里总结一些简单的调试手段。
我们可以通过主动触发一个crash来验证机器是否可以生成kdump
echo c > /proc/sysrq-trigger
2-用户态服务
kdump存在一个用户态服务kdump.service,我们可以通过查看这个服务状态检查用户态是否已经住备好了正常捕获内核panic事件。
如下是一个正常的kdump.service状态
$ systemctl status
内存屏障
1、概述
参考:对优化说不 - Linux 中的 Barrier
1.1-load/store
在介绍内存屏障前,要先了解cpu中的load和store概念。正常来说,操作系统中的数据结构是存放在内存上的,而内存又分l1-l3 cache和主存,那么当CPU对数据结构进行读写操作的时候,就需要先将内存中的数据load到cache上,最后再load到cpu的寄存器内。
系统调用
1、概述
linux中有很多的命令是通过用户态实现的调用,例如最基础的read、write函数,通过系统调用,陷入内核态,执行内核中的相关系统sys_read、sys_writeAPI逻辑。
函数的命名也基本遵循上述规律,用户态的函数通常是xyz(),而内核态中的相关调用则是sys_xyz()。由于整个流程涉及到内核态与用户态的切换,所以系统调用的实现与架构强相关。
2、用户态实现
通常来说,
内核同步机制1
1、原子操作
原子操作的核心和是完成命令整个操作不会被打断。
原子操作(atomic operation),不可分割的操作。其通过原子变量来实现,以保证单个CPU周期内,读写该变量,不能被打断,进而判断该变量的值,来解决并发引起的互斥。
由于原子操作的原理,所以在功能实现上需要硬件平台的支持,以x86平台为例,在执行原子操作的时候会在指令前增加一个LOCK_PREFIX前缀,
static __always_
内存管理1_物理内存分配
0、前言
主要分析内存的分配机制
https://blog.csdn.net/m0_65931372/article/details/126234314
1、内存结构
引自Linux 物理内存管理涉及的三大结构体之struct page
1.1 页