技术解析

Linux 服务器怎么预留资源(CPU、内存、IO 等)
0
2021-06-15 14:37:51
idczone

Linux 服务器怎么预留资源( CPU 、内存、IO 等),避免应用将 CPU 、内存、IO 全部吃完,避免出问题的时候,服务器登录不上,有大佬知道如何限制吗?


通过内核配置可以限制吗?

cgroup

谢谢回复,用 cgroup 限制应用访问资源么,有点麻烦耶,我的意思是怎么配置,例如服务器的 CPU 只能跑到 95%,预留 5%的资源,大佬有这种设置吗?

看头像就进来了

systemctl 有配置选项,你按照启动脚本加上 MemoryHigh,MemoryMax,还有 CPU 配置选项,这玩意特别有用,在搭建镜像拉取节点服务的时候防止占用过高特别有用

cgroup 限制容器或者虚拟机的资源
其实没必要预留
就算高负载运转, 不是极端情况不至于登不上
但是万一你被人打到端口都堵了, 丢包丢的稀里哗啦的, 资源预留也基本登不上了......
这种情况,VPS 一般有 VNC, 物理机有 IPMI 、KVM over IP, 实在啥也没有让机房的人帮你重启一下

守望 PG......

具体可以参照官方手册,但是要求你 linux 守护程序是 systemctl

谢谢大佬,但这种都是限制某个服务的,我的意思是指能不能通过什么配置,让服务器的 CPU 只能跑到 95%,预留 5%的资源,不至于出现极端情况,只能重启服务器。

谢谢大佬,我没表达清楚,我的意思是指能不能通过什么配置,让服务器的 CPU 只能跑到 95%,预留 5%的资源,不至于出现极端情况,只能重启服务器。

我记得可以用 systemctl 对服务切片限制的,我看看手册

好咧,坐等大佬~

我看了一下, 可以执行命令 `sudo systemctl edit --force system.slice`, 之后限定 system.slice 的切片为:
```ini
[Slice]
CPUQuota=95%
MemoryMax=1G
```
但是这种方案实际上治标不治本, 还是要排查出指定哪个服务呢问题来处理
可以参考配置:
官方文档: https://www.man7.org/linux/man-pages/man5/systemd-user.conf.5.html
网上回答: https://serverfault.com/questions/874274/systemd-per-user-cpu-and-or-memory-limits

上面的方法还是治标不治本, 最好还是利用 `sudo systemd-cgtop` 命令来查看哪个服务器占用最异常再去进行限制

感觉这是 xy 问题,确定要要解决的 x 问题,而不是花心思花精力搞 y 问题。

没看懂楼主什么意思,服务器 CPU 为什么要浪费 5%不用呢

主要目前现在 x 问题,会突发,不想在 x 问题发生的时候太过于变动

预留资源,在极端情况下,,,不至于连登录服务器查问题都做不了嘛

感谢大佬,学习 ing


你如果没手动改抢占模式, 再指定各程序优先级, 这种状况情况不可能出现的, 你让所有核跑 while(1);同时占满, 都可以无障碍登录上去
我目前碰到过无法登录的, 内核挂掉, 只能人工干预; 硬盘挂,WA 100%,登录上去基本动都不能动, 只能人工干预; 被人打爆,SSH 上去直接超时,或者登录后直接卡死, 只能人工干预.......

卡死一般是 I/O 爆了不是 CPU 爆了吧,CPU 本来就是有时间切片的,内核没挂应该不至于完全没法响应。I/O 的话,有限制的方法吗?

我没明白浪费 5%的资源怎么能够帮助解决服务器卡死的问题,你自己远程登录的时候不也是和其他程序一起挤那 95%吗

.....
我不清楚你的问题, 既然所有用户加起来只能用 95%cpu, 你登录 ssh 凭什么能用这 5%了, 难道你不是用户之一吗
mkdir -p /etc/systemd/system/user-.slice.d
cat > /etc/systemd/system/user-.slice.d/50-memory.conf << EOF
[Slice]
CPUQuota=200%
EOF
systemctl daemon-reload
假设 80 核的机器, 40 个用户就跑满了

CPU 只能跑到 95%的话,等同于把 CPU 频率降低 5%。
CPU 预留得越多,卡死的概率越大。

如果是想全局限制,95%满了和 100%满了不都没区别吗,如果是限制特定进程,cgroup

使用 lxc,性能基本无损失。可以限制 CPU 、内存、硬盘 IO

就你说的场景, 目前见过的 cgroups docker systemd. 然后 python 启动子进程设置 resource 里的最大虚拟内存, 或者 ulimit 限制虚拟内存的时候, 貌似直接把超标的杀了...
hadoop 上因为虚拟内存超标想限制下都没找到 yarn 里怎么设置唉

用 ulimit,可以临时设置限制,重启后失效。
如果想永久生效,需要修改 /etc/security/limits.conf
但是需要重新启动

同求 IO 的限制办法

是的。但是用户不一样,我的意思是能不能预留 5%的资源给 root 用户,不管其它用户对服务器的资源用到什么极端程度,我能暴涨 root 用户能上去管理

ulimit 能限制 IO 这些吗?

同意 你的这种需求建议上 ESXi 之类的虚拟化平台,把系统创建在虚拟机里,这样可以确保不管哪个超标,你都能登录上管理平台,而且以后直接在网页端就可以维护,也方便。

ulimit 和 limits.conf 都不能按照百分比设置限制,或许你可以手动算一下。
能限制用户内存使用、线程数量和同时打开的文件数量。

①以下是 ulimit 使用帮助
ulimit --help
ulimit: ulimit [-SHabcdefiklmnpqrstuvxPT] [限制]
修改 shell 资源限制。

在允许此类控制的系统上,提供对于 shell 及其创建的进程所可用的
资源的控制。

选项:
-S 使用软 (`soft') 资源限制
-H 使用硬 (`hard') 资源限制
-a 所有当前限制都被报告
-b 套接字缓存尺寸
-c 创建的核文件的最大尺寸
-d 一个进程的数据区的最大尺寸
-e 最高的调度优先级 (`nice')
-f 有 shell 及其子进程可以写的最大文件尺寸
-i 最多的可以挂起的信号数
-k 分配给此进程的最大 kqueue 数量
-l 一个进程可以锁定的最大内存尺寸
-m 最大的内存进驻尺寸
-n 最多的打开的文件描述符个数
-p 管道缓冲区尺寸
-q POSIX 信息队列的最大字节数
-r 实时调度的最大优先级
-s 最大栈尺寸
-t 最大的 CPU 时间,以秒为单位
-u 最大用户进程数
-v 虚拟内存尺寸
-x 最大的文件锁数量
-P 最大伪终端数量
-T 最大线程数量
并非所有选项在所有系统上可用。
如果提供了 LIMIT 变量,则它为指定资源的新的值;特别的 LIMIT 值为`soft'、`hard'和`unlimited',分别表示当前的软限制,硬限制和无限制。否则打印指定资源的当前限制值,不带选项则假定为 -f

取值都是 1024 字节为单位,除了 -t 以秒为单位,-p 以 512 字节递增,-u 为无范围的进程数量。

② /etc/security/limits.conf 使用帮助
命令如下:vim /etc/security/limits.conf
按以下格式写入
域 类型 项 值
ftp hard nproc 0

域---可以是:
- 用户名
- 具有组语法的组名称
- 通配符* ,用于默认条目
- 通配符% ,也可以与组语法一起使用
类型---可以具有两个值:
- 执行软限制
- 执行硬限制
项---可以是以下项之一:
- core - 限制核心文件大小 ( KB )
- data - 最大数据大小 ( KB )
- fsize - 最大文件化 ( KB )
- memlock - 最大锁定内存地址空间 ( KB )
- nofile - 打开文件描述符的最大数量
- rss - 最大驻留集大小 ( KB )
- stack - 最大堆栈大小 ( KB )
- cpu - 最大 CPU 时间(最小值)
- nproc - 最大工艺数
- as - 地址空间限制 ( KB )
- maxlogins - 此用户的最大登录数
- maxsyslogins - 系统上的最大登录数
- priority - 使用
- locks - 用户可以保留的文件锁的最大数量
- sigpending - 挂起信号的最大数量
- msgqueue - POSIX 消息队列使用的最大内存数(字节)
- nice - 最大好优先级允许提高到值: - 20,19
- rtprio - 最大实时优先级

如果你想设置某些进程的资源占用
建议使用修改 /etc/security/limits.conf 的方法
设置项目比较详细,且文件中有设置实例可以参照
但要注意一个问题,以上内容我并没有完全实践过,如果在修改设置后出现服务不正常的现象,请再次修改 /etc/security/limits.conf
直接将新加入的内容用/>hard nproc 0

啊还有,目前很多软件自身就可以修改占用系统资源的多少。
比如
nginx,可以在配置文件中声明 nginx 可以同时运行多少个进程,每个进程允许有多少个并发连接。
mysql,可以设置服务端占用多少内存资源,最大连接数,和查询速度什么的。
如果服务器收到的正常访问请求太多,建议做负载平衡,而不是限制使用。(需要多台服务器)
那是硬件资源的浪费。
一般在内核没有崩溃的情况下,linux 会响应 SSH 连接。可能比较慢,但还不至于完全卡住。
SSH 完全没反应就 VNC

那我为什么不能把 openssh 放到那 5%呢?


IO 没有那么简单 cgv1 可以限制 direct IO cgv2 可以限制 buffer IO (印象中

看上面的回复,这都有人杠,应该没遇到多租户抢资源吧

服务器卡死一般遇到的是内存不足触发 oom,但因为 oom 也需要内存,所以就卡死,登录不了。
没碰到磁盘 cpu 问题导致无法 ssh
针对内存,我装了 earlyoom 提前杀掉可能会 oom 的进程

楼主可没这么说

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服