namesapce、cgroup
dd:
-
制作磁盘镜像:借助
dd
指令能够把整个磁盘或者分区的数据复制到一个文件里,形成磁盘镜像文件。此镜像文件可用于备份数据或者在其他系统中恢复磁盘。 -
恢复磁盘镜像:可以把之前创建的磁盘镜像文件恢复到磁盘或者分区
-
磁盘初始化:使用
dd
指令能够把全零数据写入磁盘,从而达成磁盘初始化的目的。这样做可以消除磁盘上的所有数据,为新数据的写入做好准备。 -
数据转换:
dd
指令能够在复制数据的同时对数据进行转换。例如,可以把数据从一种编码格式转换为另一种编码格式,或者将数据转换为大写或小写等。 -
设备数据读取与写入:
dd
指令可以用来从设备(如硬盘、U 盘、光盘等)读取数据,或者将数据写入到设备中
bs 指定块大小。磁盘以扇区为基本单位。每次IO计算机可以读取整数倍的扇区大小,因此快的大小最好是扇区数的整数倍。同时注意不能将块大小设置的太大或者太小。太大则有内存溢出的奉孝。太小会导致IO效率较低。
/dev/zero是OS中特殊的一个文件,可以连续不断的输出空字符。下面是使用dd指令创建一个镜像文件,bs指定块大小,count指定该文件中包含多少块:
文件格式转换:
mkfs:
格式化新磁盘或分区
当你新添加了一块硬盘、U 盘或者对已有的磁盘进行了分区操作后,需要在这些磁盘或分区上创建文件系统,才能存储数据。例如,当你安装了一块新的固态硬盘,就可以使用 mkfs
为其创建合适的文件系统。
更改文件系统类型
若原本磁盘或分区上的文件系统不再适用,你可以使用 mkfs
重新格式化并更换为其他文件系统类型。比如,把原来使用 ext4
文件系统的分区,重新格式化为 xfs
文件系统。
修复损坏的文件系统
在某些情况下,文件系统可能会因为意外断电、硬件故障等原因而损坏。在尝试其他修复方法无效后,可以考虑使用 mkfs
格式化磁盘或分区,不过这种操作会清除原有数据,所以要提前备份重要数据。
使用dd命令创建出一个空白文件后,可以使用mkfs指令在该文件上建立文件系统:
df:
监控磁盘使用情况
-
服务器维护:在服务器运维中,需要时刻关注磁盘的使用状况,防止磁盘空间占满影响服务器正常运行。例如,Web 服务器的日志文件会不断增大,如果磁盘空间不足,可能会导致日志无法正常记录,影响系统的监控和故障排查。通过
df
指令,管理员可以定期查看各个磁盘分区的使用情况,及时清理磁盘或增加存储设备。 -
个人计算机管理:对于个人用户来说,也可能会遇到磁盘空间不足的问题,比如下载大量文件或者安装大型软件后。使用
df
指令可以帮助用户了解磁盘的剩余空间,决定是否需要清理不必要的文件。
检查文件系统挂载情况
df
指令会显示已挂载的文件系统信息,包括文件系统的挂载点。这有助于用户确认文件系统是否正确挂载。例如,在使用外部存储设备(如 U 盘、移动硬盘)时,可能会遇到挂载失败的情况,通过 df
指令查看挂载信息,就可以判断设备是否成功挂载到系统中。
df -h:
loop设备为虚拟块设备。将普通文件映射为一个块设备后,它允许用户将文件作为块设备来使用,通过模拟物理磁盘的方式访问文件内容。
mount:
加载文件系统到指定挂载点。
使用mount指令将刚才创建的data.img文件挂载到一个指定的目录中:
使用dd指令可以复制设备上的某个硬盘的分区为一个镜像文件,然后使用mount指令将该文件挂载到某个目录下,就可以向文件一样访问该镜像文件。
unshare:
与父进程不共享父进程的命名空间。
隔离挂载点 :unshare --mount --fork /bash/bin . 在新的bash中新挂载一些文件,外层的主机不会看到被隔离的bash锁挂载的分区
pidstat:
pidstat
是 sysstat
软件包中的一个实用工具,用于监控和统计 Linux 系统中进程和线程的资源使用情况。
监控 CPU 使用情况
-
查看进程的 CPU 利用率:可以了解某个进程在一段时间内占用 CPU 的百分比,有助于发现哪些进程消耗了过多的 CPU 资源,从而进行性能优化或故障排查。例如,当系统响应变慢时,通过
pidstat
可以找出占用 CPU 较高的进程,判断是否是某个程序出现了死循环或者资源泄漏问题。 -
分析进程的 CPU 时间分配:能区分进程的用户态 CPU 时间和内核态 CPU 时间。用户态 CPU 时间是进程在用户空间执行代码所花费的时间,内核态 CPU 时间是进程在内核空间执行系统调用所花费的时间。通过分析这两种时间的占比,可以了解进程的性能瓶颈所在。
监控内存使用情况
-
统计进程的内存使用量:可以查看进程占用的物理内存、虚拟内存等信息。对于内存密集型应用,通过
pidstat
可以监控其内存使用的变化趋势,避免出现内存泄漏或过度使用内存的情况。 -
分析内存使用的增长情况:通过持续观察进程的内存使用量,判断其是否随着时间不断增长。如果内存使用量持续上升且没有下降的趋势,可能存在内存泄漏问题,需要进一步排查代码。
监控 I/O 使用情况
-
查看进程的磁盘 I/O 读写速率:可以了解进程在磁盘上的读写操作频率和数据量,找出哪些进程进行了大量的磁盘 I/O 操作。对于数据库服务器等对磁盘 I/O 要求较高的系统,这有助于优化磁盘性能和调整数据库配置。
-
分析 I/O 等待时间:
pidstat
可以显示进程的 I/O 等待时间,即进程因为等待磁盘 I/O 完成而处于阻塞状态的时间。较高的 I/O 等待时间可能意味着磁盘性能不足或者磁盘负载过高。
监控线程使用情况
-
查看进程内线程的资源使用情况:
pidstat
可以深入到进程内部,统计每个线程的 CPU、内存和 I/O 使用情况。在多线程应用中,这有助于分析哪些线程消耗了较多的资源,从而进行线程级别的优化。
stress:
liunx压力测试工具,它可以通过模拟高负载场景,让系统的 CPU、内存、磁盘 I/O 和网络等资源处于高强度使用状态,以此来评估系统在压力环境下的性能和稳定性。课配合pidstat指令来观察相应的资源占用情况。
# 对 CPU 进行压力测试,创建 4 个 CPU 密集型进程
stress --cpu 4# 对内存进行压力测试,分配 2GB 内存
stress --vm 1 --vm-bytes 2G# 对磁盘 I/O 进行压力测试,创建 2 个 I/O 密集型进程
stress --io 2# 同时对 CPU、内存和磁盘 I/O 进行压力测试,持续 60 秒
stress --cpu 4 --vm 1 --vm-bytes 2G --io 2 --timeout 60s
Cgroup:
cgroup
(Control Group)是 Linux 内核提供的一种资源管理机制,它允许将一组进程组织在一起,并对这些进程的资源使用进行限制、隔离和统计,如限制进程组使用的 CPU 时间、内存大小、磁盘 I/O 带宽等,以实现系统资源的合理分配和有效利用,防止单个或一组进程过度占用资源而影响其他进程的正常运行。
基于挂载虚拟文件系统的进程分组管理:
挂载 cgroup
虚拟文件系统:在系统启动时,会将 cgroup
相关的虚拟文件系统挂载到指定的目录下,比如常见的 /sys/fs/cgroup/
目录。该目录是 cgroups 的 用户空间接口,通过操作该目录下的文件和子目录,可配置资源策略并获取实时统计数据这个目录下会包含各种不同的子目录,每个子目录代表一个 cgroup
子系统,如 cpu
、memory
、blkio
等,分别用于管理不同类型的资源。
-
可通过mount | grep cgroup 查看cgroup文件的挂载位置:
目录下的子目录(如 cpu、memory、blkio 等)对应不同的 资源子系统,每个子系统负责一类资源的控制:
cpu/cpuacct:控制 CPU 时间分配(如限制某个组的 CPU 使用率),统计 CPU 使用时间。
memory:限制进程组的内存使用上限(如最大内存、swap 空间),监控内存泄漏。
blkio:控制块设备(硬盘、SSD 等)的 I/O 带宽(如限制某个组的磁盘读写速度)。
cpuset:指定进程组只能运行在特定 CPU 核心或内存节点上(亲和性设置)。
其他子系统:如 devices(设备访问控制)、net_cls(网络流量分类)等。 -
通过cat /proc/$$/cgroup 可以查看当前进程的资源限制:
-
/proc 是 Linux 内核提供的一个虚拟文件系统,它并不实际存储在磁盘上,而是将内核中的数据结构以文件和目录的形式呈现给用户空间。通过访问
/proc
下的文件和目录,用户可以获取系统的各种信息,如进程信息、系统状态、内核参数等。每个正在运行的进程在/proc
目录下都有一个以其进程 ID(PID)命名的子目录,用于存储该进程的相关信息。 -
cgroup文件记录了进程所属的 cgroup信息,每行通常包含三个字段,用冒号 分隔,格式如下: <层级 ID>:<子系统列表>:<cgroup 路径> 。文件路径“/”就是cgroup虚拟文件的挂载位置。当文件路径为“/”根目录时,说明没有对该资源进行特别的限制。
创建进程组并关联资源限制:当需要对一组进程进行资源管理时,就会在相应的 cgroup 子系统目录下创建一个新的子目录,这个子目录就代表了一个进程组。例如,要限制某个进程组的 memory 使用,就会在 /sys/fs/cgroup/memory /目录下创建一个新的子目录,比如 my_group。然后,通过在这个子目录下创建和修改一些特殊的文件,来设置该进程组的 资源限制参数。
- 下面显示如何对进程的内存资源进行限制。首先来到cgroup相应的memory子系统下建立一个新的目录:
#查看cgroup子系统的目录 mount | grep cgroup #来到相应的子系统目录下 cd /sys/fs/cgroup/memory#新建目录 mkdir my_cgroup
- 目录创建好后,系统会在该目录下自动创建一些配置文件:
- 要对内存进行限制,需要修改相应文件中的值,这里需要修改memory.limit_in_bytes文件中的值:
将进程加入进程组:通过将进程的 PID(进程标识符)写入到 cgroup 虚拟文件系统中相应进程组目录下的 tasks 文件中,就可以将该进程加入到对应的进程组中。这样,cgroup 就可以根据设置的资源限制参数对这个进程组中的所有进程进行统一的资源管理和限制。例如,当一个进程尝试使用超过 cgroup 限制的 CPU 时间时,内核会根据 cgroup 的设置来限制该进程的 CPU 使用,确保它不会超出分配的资源额度。