Linux namespace 和 cgroups,一次性搞清楚~
先放结论,namespace 是用来做资源隔离, cgroup 是用来做资源限制。
Namespace
先说Namespace,虚拟技术基本要求就是资源隔离,简单的说就是我独占当前所有的资源。比如我在 8080 端口起 web 服务器,不用担心其他进程端口占用。Linux 自带 namespace 就能达到这个目的。namespace 从2002 开始开发到现在已经快20年的历史了,到现在一共有6种 namespace:
-
mnt, 文件系统
-
pid, 进程
-
net, 网络
-
ipc, 系统进程通信
-
uts, hostname
-
user, 用户
可以通过三个系统调用的方式
-
clone,创建新的进程和新的namespace,新创建的进程 attach 到新创建的 namespace
-
unshare,不创建新的进程,创建新的 namespace 并把当前进程 attach 上
-
setns, attach 进程到已有的 namespace 上
shell 也提供了一个和系统调用同名的 unshare 命令可以非常简单的创建 namespace。
sudo unshare --fork --pid --mount-proc bash
这样创建了一个新的 PID namespace 并在里面运行了 bash。我们看看当前 namespace 的进程
在这个 namespace 里,就只有两个进程了。
Cgroups
cgroups 是 control groups 控制组的意思, 可以通过文件系统来访问这些信息。一般cgroups 挂载在 /sys/fs/cgroup
内核会读取这些信息来调度资源分配给每个进程。比如我要限制进程占用CPU的时间。我用 Go 写了一个模拟高 CPU 的代码。
func IsPrime(value int) bool {
for i := 2; i <= int(math.Floor(float64(value)/2)); i++ {
if value%2 == 0 {
return false
}
}
return true
}
func main() {
for i := 0; i < 999999999; i++ {
fmt.Printf("%v is prime: %v\n", i, IsPrime(i))
}
}
我创建两个 CPU 的 cgroups
sudo cgcreate -g cpu:/cpulimited
sudo cgcreate -g cpu:/lesscpulimited
cpu.shares 是给内核为每个进程决定 CPU 计算资源,默认值是1024。给 cpulimited 设置为 512,lesscpulimited 保留默认值,那么在这两个组的进程会以1 :2的比例占用CPU。
sudo cgset -r cpu.shares=512 cpulimited
我们来验证一下。
在 cpulimited 起一个进程
sudo cgexec -g cpu:cpulimited ./main > /dev/null &
可以看到独占了 100% 的 CPU,在 cpulimited 再起一个进程
两个进程都在 cpulimited,各占50%的 CPU。在 lesscpulimited 起一个进程
sudo cgexec -g cpu:lesscpulimited ./main > /dev/null &
两个 cpulimited 进程的 CPU 之和 与 一个 lesscpulimited 进程的 CPU 差不多就是 1:2的关系。
来源:https://zhuanlan.zhihu.com/p/55099839
DevOps 国际峰会 2022 · 北京站正在来临,敬请期待~
扫码抢先看精彩内容
近期好文:
记一次 Kubernetes 集群被入侵,服务器变矿机
“高效运维”公众号诚邀广大技术人员投稿,
投稿邮箱:[email protected],或添加联系人微信:greatops1118.
点个“在看”,一年不宕机
- 高效研发运维体系构建的流程和方法论
- 顽固的僵尸进程,这些高效神奇的 Linux 命令助你奇效
- 建议收藏!史上最全的容器运行时介绍,没有之一!
- 高效实践|运维指标体系在银行业务的应用实践
- 高效实践|运维指标体系在银行业务的应用实践
- 期待感拉满!2022年GOPS全球运维大会·深圳站精彩抢先看!
- Linux 高性能服务 epoll 的本质,真的不简单
- 有了这款 Linux 网络延迟排查方法,再也不用加班了
- 什么是 Vlan、三层交换机、网关、DNS、子网掩码、MAC地址,这是我看过最易懂的方法
- 为了提升系统的稳定性,没想到运维这么拼~
- 轻量化日志 Loki 全攻略,再也不会整懵了
- 简明 Systemd 入门指南,重点都划好了~
- Linux namespace 和 cgroups,一次性搞清楚~
- 容器与 Pod 有什么区别和联系?这篇文章告诉你
- 运维常用的35个Linux Shell 脚本,一定能帮到你!
- 运维必知必会的 Kubectl 命令总结,拿好了~
- 请收藏 | 10 款你不知道的 Linux 环境下的替代工具!
- 上海券业抗疫进行时!工程师值守机房两周、每天工作18小时,客服中心承接大量线下业务
- 智慧园区如何高效运行?教你一招完胜
- K8S 内存泄漏&证书过期怎么办?这篇文章告诉你