作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们的Linux进阶部分,到目前为止,已经讲过:硬件,日常运维,基础软件,日志,进阶命令,防火墙,Shell编程,以及本章将要讲解的内核相关内容,和最后一章Linux系统。
让我们了解和熟悉基本的Linux内核相关的信息,Linux内核我们主要从以下几个方面来讲解:
Linux内核-什么是内核
Linux内核-内核模块&参数
Linux内核-proc文件系统
Linux内核-sys文件系统(本章节)
Linux内核-tmpfs文件系统
如果是抢cpu,怎么办?如果是抢内存,怎么办?
这里需要了解几个概念:时间分片,由于cpu速度非常的快,我们可以简单理解就是把时间划分成更小的单位,比如1秒,我们把它分成100份。当某个任务需要执行的时候,它申请cpu资源,然后内核调度cpu完成它的任务,如果这个任务比较简单,再一个时间分片规定的时间还没用完,它就结束了,它就会主动让出cpu,给其他人用。如果这个任务比较复杂,则一个时间分片无法完成,则它还排队等待第二个时间分配继续执行。如果任务非常多,则多人进行排队,则系统就会显得比较慢。
刚才说的是cpu,现在来说说内存,不同应用程序运行都会申请一定量的内存,他们都是从物理内存划分出来,而内存的特性决定了它你申请的内存就只能你用,我申请的内存只能我用,当内存被申请光了,程序还需要内存的时候怎么办呢?这就衍生出来另外一个概念 “OOM” 即 “Out of Memory”,中文意思为内存溢出。
默认情况,我们运行的普通程序都是可以任意申请服务器的资源,为了保证服务器稳定可靠运行,所以我们需要对应用程序进行限制,而这个限制就通过/sys/fs/cgroup实现的。
在 Linux 系统中,/sys 目录是一个虚拟文件系统,它提供了关于系统设备、内核参数以及硬件状态等信息的接口。以下是对 /sys 目录的详细介绍:
一、主要作用
/sys 目录主要用于与内核进行交互,允许用户空间程序获取系统信息和配置硬件参数,而无需直接修改内核代码。它为系统管理员和开发人员提供了一种方便的方式来监视和调整系统的各种属性。
二、目录结构
其实这些目录,我们平时是很难关注到的,但是我们后期将要学习的虚拟化,Docker,Kubernetes都会用到这个下面/sys/fs/cgroup目录。
三、cgroup介绍
控制组(cgroup)是 Linux 内核提供的一种可以限制、记录和隔离进程组所使用的物理资源(如 CPU、内存、磁盘 I/O 等)的机制。以下是关于 cgroup 的详细介绍:
3.1、主要作用
3.2、主要子系统
cpu
子系统:memory
子系统:blkio
子系统:cpuset
子系统:3.2.1、cpu
如果要限制cpu,则在cpu目录创建一个目录,创建目录以后,它里面会自动生成文件,我们通过操作就可以实现对进程的cpu限制。
准备一个死循环的脚本,它会持续占用cpu达到100%
#!/bin/bash
while true; do
true
done
创建cpu限制
mkdir /sys/fs/cgroup/cpu/cpu
cd /sys/fs/cgroup/cpu/cpu
#找到刚才的死循环的进程id
echo $pid > tasks
#这个40000是40%的意思,参考cpu.cfs_period_us文件里面的值
echo 40000 > cpu.cfs_quota_us
3.2.2、memory
创建一个程序,持续申请内存
import time
memory = ""
increment_size = 20 * 1024 * 1024 # 20MB in characters (assuming 1 byte per character)
try:
while True:
for _ in range(increment_size):
memory += "a"
time.sleep(1)
print(f"Approximate memory used: {len(memory) / (1024 * 1024)} MB")
time.sleep(1)
except MemoryError:
print("Out of memory!")
finally:
del memory
如果不做额外的限制情况下,它会持续消耗系统内存,直到内核为了保护系统,把它给oom掉。
[Fri Sep 27 00:10:04 2024] Out of memory: Kill process 28358 (python3) score 660 or sacrifice child
[Fri Sep 27 00:10:04 2024] Killed process 28358 (python3), UID 0, total-vm:1344800kB, anon-rss:1222480kB, file-rss:164kB, shmem-rss:0kB
我们再次运行这个程序,需要给它添加内存限制
mkdir /sys/fs/cgroup/memory/test
cd /sys/fs/cgroup/memory/test/
#找到刚才的python的进程id
echo $pid > tasks
echo 536870912 > memory.limit_in_bytes
[Fri Sep 27 00:18:05 2024] Task in /test killed as a result of limit of /test
[Fri Sep 27 00:18:05 2024] memory: usage 524288kB, limit 524288kB, failcnt 12
[Fri Sep 27 00:18:05 2024] memory+swap: usage 524288kB, limit 9007199254740988kB, failcnt 0
[Fri Sep 27 00:18:05 2024] kmem: usage 0kB, limit 9007199254740988kB, failcnt 0
[Fri Sep 27 00:18:05 2024] Memory cgroup stats for /test: cache:0KB rss:524288KB rss_huge:0KB mapped_file:0KB swap:0KB inactive_anon:0KB active_anon:524284KB inactive_file:0KB active_file:0KB unevictable:0KB
[Fri Sep 27 00:18:05 2024] [ pid ] uid tgid total_vm rss nr_ptes swapents oom_score_adj name
[Fri Sep 27 00:18:05 2024] [ 1624] 0 1624 188881 159011 323 0 0 python3
[Fri Sep 27 00:18:05 2024] Memory cgroup out of memory: Kill process 1624 (python3) score 1179 or sacrifice child
[Fri Sep 27 00:18:05 2024] Killed process 1624 (python3), UID 0, total-vm:755524kB, anon-rss:633232kB, file-rss:2812kB, shmem-rss:0kB
可以看到并没有把内存跑满,而是触发了我们的限制而被oom。