前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux内核-sys文件系统

Linux内核-sys文件系统

作者头像
运维小路
发布2024-11-01 20:12:13
870
发布2024-11-01 20:12:13
举报
文章被收录于专栏:运维小路

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们的Linux进阶部分,到目前为止,已经讲过:硬件,日常运维,基础软件,日志,进阶命令,防火墙,Shell编程,以及本章将要讲解的内核相关内容,和最后一章Linux系统。

让我们了解和熟悉基本的Linux内核相关的信息,Linux内核我们主要从以下几个方面来讲解:

Linux内核-什么是内核

Linux内核-内核模块&参数

Linux内核-proc文件系统

Linux内核-sys文件系统(本章节)

Linux内核-tmpfs文件系统

在讲sys文件系统系统之前,我们先思考一个问题?我们一台服务器的cpu和内存是有限的,如何能保证里面多个服务都能正常使用,从而避免资源争抢的情况发生呢?

如果是抢cpu,怎么办?如果是抢内存,怎么办?

这里需要了解几个概念:时间分片,由于cpu速度非常的快,我们可以简单理解就是把时间划分成更小的单位,比如1秒,我们把它分成100份。当某个任务需要执行的时候,它申请cpu资源,然后内核调度cpu完成它的任务,如果这个任务比较简单,再一个时间分片规定的时间还没用完,它就结束了,它就会主动让出cpu,给其他人用。如果这个任务比较复杂,则一个时间分片无法完成,则它还排队等待第二个时间分配继续执行。如果任务非常多,则多人进行排队,则系统就会显得比较慢。

刚才说的是cpu,现在来说说内存,不同应用程序运行都会申请一定量的内存,他们都是从物理内存划分出来,而内存的特性决定了它你申请的内存就只能你用,我申请的内存只能我用,当内存被申请光了,程序还需要内存的时候怎么办呢?这就衍生出来另外一个概念 “OOM” 即 “Out of Memory”,中文意思为内存溢出。

默认情况,我们运行的普通程序都是可以任意申请服务器的资源,为了保证服务器稳定可靠运行,所以我们需要对应用程序进行限制,而这个限制就通过/sys/fs/cgroup实现的。

在 Linux 系统中,/sys 目录是一个虚拟文件系统,它提供了关于系统设备、内核参数以及硬件状态等信息的接口。以下是对 /sys 目录的详细介绍:

一、主要作用

/sys 目录主要用于与内核进行交互,允许用户空间程序获取系统信息和配置硬件参数,而无需直接修改内核代码。它为系统管理员和开发人员提供了一种方便的方式来监视和调整系统的各种属性。

二、目录结构

  1. /sys/devices/:
    • 这是 /sys 目录中最重要的子目录之一,它包含了系统中所有的设备信息。每个设备在这个目录下都有一个对应的子目录,其中包含了设备的属性文件、链接和其他相关信息。
    • 例如,/sys/devices/pci0000:00/0000:00:1f.2/ 可能表示一个 PCI 设备的信息目录,其中包含了设备的型号、厂商、资源分配等信息。
  2. /sys/class/:
    • 这个目录按照设备的类型进行分类,提供了一种更易于理解和使用的设备组织方式。
    • 例如,/sys/class/net/ 目录下包含了系统中的所有网络接口设备,每个网络接口都有一个对应的子目录,其中包含了设备的属性文件和操作接口。
  3. /sys/block/:
    • 包含了系统中的所有块设备信息,如硬盘、固态硬盘、U 盘 等。
    • 每个块设备在这个目录下都有一个对应的子目录,其中包含了设备的属性文件和操作接口,如设备的大小、扇区大小、读写状态等。
  4. /sys/bus/:
    • 按照总线类型对设备进行分类,如 PCI 总线、USB 总线等。
    • 每个总线类型在这个目录下都有一个对应的子目录,其中包含了该总线类型下的设备信息和驱动程序信息。

其实这些目录,我们平时是很难关注到的,但是我们后期将要学习的虚拟化,Docker,Kubernetes都会用到这个下面/sys/fs/cgroup目录。

三、cgroup介绍

控制组(cgroup)是 Linux 内核提供的一种可以限制、记录和隔离进程组所使用的物理资源(如 CPU、内存、磁盘 I/O 等)的机制。以下是关于 cgroup 的详细介绍:

3.1、主要作用

  1. 资源管理与限制:
    • 可以对特定的进程组分配和限制 CPU 时间、内存使用量、磁盘 I/O 带宽等资源。这有助于确保关键任务能够获得足够的资源,同时防止某些进程过度消耗资源而影响系统的整体性能。
    • 例如,可以限制一个高负载的数据库容器只能使用一定比例的 CPU 和内存,以避免它影响到其他应用程序的运行。
  2. 资源隔离:
    • 将不同的进程组隔离在不同的资源集合中,使得它们之间的资源使用互不干扰。这对于在同一系统上运行多个不同服务或租户的场景非常有用。
    • 比如,在一个多租户的云环境中,可以使用 cgroup 为每个租户的应用程序提供独立的资源环境,确保一个租户的资源使用不会影响到其他租户。
  3. 性能优化:
    • 通过将特定的进程绑定到特定的 CPU 核心或调整 I/O 优先级,可以优化系统的性能。
    • 例如,对于实时性要求较高的应用程序,可以将其绑定到专用的 CPU 核心上,以减少上下文切换和干扰,提高响应速度。

3.2、主要子系统

  1. cpu子系统:
    • 控制进程组对 CPU 资源的使用。可以设置 CPU 时间配额、CPU 核心绑定等参数。
    • 例如,可以限制一个容器只能使用 50% 的 CPU 时间,或者将其绑定到特定的 CPU 核心上。
  2. memory子系统:
    • 管理进程组的内存使用。可以设置内存限制、内存交换限制等参数。
    • 例如,可以限制一个容器最多使用 1GB 的内存,当内存使用超过限制时,内核可以采取一些措施,如终止容器或进行内存回收。
  3. blkio子系统:
    • 控制进程组对块设备(如硬盘、固态硬盘)的 I/O 操作。可以设置 I/O 带宽限制、I/O 优先级等参数。
    • 例如,可以限制一个数据库容器对磁盘的 I/O 带宽,以避免它影响到其他应用程序的磁盘访问。
  4. cpuset子系统:
    • 用于设置进程组可以使用的 CPU 核心和内存节点。可以将特定的进程组绑定到指定的 CPU 核心和内存节点上,提高性能和资源隔离性。
    • 例如,可以将一个高优先级的任务绑定到特定的 CPU 核心和内存节点上,避免受到其他任务的干扰。

3.2.1、cpu

如果要限制cpu,则在cpu目录创建一个目录,创建目录以后,它里面会自动生成文件,我们通过操作就可以实现对进程的cpu限制。

准备一个死循环的脚本,它会持续占用cpu达到100%

代码语言:javascript
复制
#!/bin/bash

while true; do
    true
done

创建cpu限制

代码语言:javascript
复制
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

创建一个程序,持续申请内存

代码语言:javascript
复制
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掉。

代码语言:javascript
复制
[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

我们再次运行这个程序,需要给它添加内存限制

代码语言:javascript
复制
mkdir /sys/fs/cgroup/memory/test
cd /sys/fs/cgroup/memory/test/
#找到刚才的python的进程id
echo $pid > tasks
echo 536870912 > memory.limit_in_bytes
代码语言:javascript
复制
[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。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在讲sys文件系统系统之前,我们先思考一个问题?我们一台服务器的cpu和内存是有限的,如何能保证里面多个服务都能正常使用,从而避免资源争抢的情况发生呢?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档