DevOps is the union of people, process, and technology to continually provide value to customers.
Devops
进程、线程、协程
- 进程(Process)
- 进程是具有一定独立功能的程序在一定数据集上的运行活动,进程是系统中进行资源分配和调度的独立单元。每个进程都有自己独立的内存空间,不同的进程通过进程间通信进行通信。由于进程比较重,占用独立内存,上下文进程之间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但是比较稳定和安全。
- 线程(Thread)
- 线程是进程的一个实体,是CPU调度和分派的基本单位。它是一个比进程更小的基本单元,可以独立运行。线程本身基本上不拥有系统资源,只有少数运行中必不可少的资源(如程序计数器、一组寄存器和堆栈),但它可以与属于同一进程的其他线程共享该进程拥有的所有资源过程。线程间通信主要是通过共享内存,上下文切换速度快,资源开销少,但相对于进程来说不够稳定,容易丢失数据。
- 协程(Coroutine)
- 协程是用户态的轻量级线程,协程的调度完全由用户控制。协程有自己的寄存器上下文和堆栈。当协程调度切换时,将寄存器上下文和堆栈保存到其他地方。切换回来时,恢复之前保存的寄存器上下文和堆栈。直接操作栈基本不会有内核切换开销,可以不加锁访问全局变量,所以上下文切换非常快。
CPU 性能分析工具
top
、mpstat
、pidstat
、uptime
、vmstate
关注点:
上下文切换(cs context switch):过多的上下文切换会导致 CPU时间消耗在寄存器、内存栈以及虚拟内存等数据的保存和恢复上,从而缩短真正运行的时间。
- 自愿上下文切换:进程无法获取到所需要的资源导致的上下文切换。比如 I/O 、内存等系统资源不足
- 非自愿上下文切换:进程因为时间片到时原因,被系统强制调度。
就绪队列长度(r runing or runnable):是正在运行和等待 CPU 的进程数。
不可中断睡眠状态的进程数(b Blocked):处于不可中断睡眠状态的进程数。
Linux 启动顺序
针对不同的架构,引导的方式有所差异。x86支持UEFI(Unified Extensible Firmware Interface)和BIOS方式启动,AArch64仅支持UEFI方式启动。 统一的可扩展固件接口UEFI是一种全新类型的接口标准,用于开机自检、引导操作系统的启动,是传统BIOS的一种替代方案
- 第一阶段:硬件引导启动
- Power ON 加电自检:主要检查外围设备CPU、内存等
- BIOS POST初始化硬件:
- 加载MBR到内存阶段:BIOS 读取并执行启动设备的MBR中的Bootloader
- 第二阶段:GRUB2启动引导阶段
- 解析grub的配置文件 /boot 分区下 /boot/grub/grub.conf, 显示操作系统启动菜单。
- 加载内存镜像到内存
- 通过 /boot/initrd 开头文件建立虚拟 DAM DISK 虚拟文件系统,转交给内核
- 第三阶段:内核引导阶段
- 加载解压内核:执行核心的程序,为了让内核足够小,硬件驱动并没有放在内核文件里面
- 内核初始化:启动systemd程序,先执行initrd.target, 挂载 /etc/fstab 文件中的文件系统。
- 从 initramfs 根文件系统切换到磁盘的根目录
- 第四阶段:systemd初始化阶段
- systemd 执行默认target配置
Docker
Docker 是什么
Docker本身所用到的隔离技术也并不是什么黑科技,都是把已有的功能翻出来拼装了一下而已。容器的本质是一个“单进程”模型,本质是一个特殊的进程而已
Docker 容器技术是由 Namespace、Cgroups、rootfs 三种技术构建出
- Namespace : Linux很早版本就实现的一个系统调用,他可以实现新创建一个进程的时候,为这个进程创建一个沙盒,有挂载点、UTS(主机名)、共享内存、进程号、网络、用户 几种
- Cgroups:用来限制资源使用的一种技术
- rootfs:挂载在容器根目录上,用来给容器进程提供隔离后执行环境的文件系统就是 rootfs(根文件系统),其利用了 Union File System 的能力,将多个目录挂载到同一个目录之上。