Linux 服务器怎么预留资源( CPU 、内存、IO 等),避免应用将 CPU 、内存、IO 全部吃完,避免出问题的时候,服务器登录不上,有大佬知道如何限制吗?
1
symb0l OP 通过内核配置可以限制吗?
|
2
aheadlead 2020-12-25 19:33:12 +08:00 via iPhone
cgroup
|
3
symb0l OP @aheadlead 谢谢回复,用 cgroup 限制应用访问资源么,有点麻烦耶,我的意思是怎么配置,例如服务器的 CPU 只能跑到 95%,预留 5%的资源,大佬有这种设置吗?
|
4
taogen 2020-12-25 19:35:23 +08:00 5
看头像就进来了
|
5
MeteorCat 2020-12-25 19:35:56 +08:00 via Android
systemctl 有配置选项,你按照启动脚本加上 MemoryHigh,MemoryMax,还有 CPU 配置选项,这玩意特别有用,在搭建镜像拉取节点服务的时候防止占用过高特别有用
|
6
westoy 2020-12-25 19:36:00 +08:00
cgroup 限制容器或者虚拟机的资源
其实没必要预留 就算高负载运转, 不是极端情况不至于登不上 但是万一你被人打到端口都堵了, 丢包丢的稀里哗啦的, 资源预留也基本登不上了...... 这种情况,VPS 一般有 VNC, 物理机有 IPMI 、KVM over IP, 实在啥也没有让机房的人帮你重启一下 |
8
MeteorCat 2020-12-25 19:36:35 +08:00 via Android
具体可以参照官方手册,但是要求你 linux 守护程序是 systemctl
|
9
symb0l OP @MeteorCat 谢谢大佬,但这种都是限制某个服务的,我的意思是指能不能通过什么配置,让服务器的 CPU 只能跑到 95%,预留 5%的资源,不至于出现极端情况,只能重启服务器。
|
10
symb0l OP @westoy 谢谢大佬,我没表达清楚,我的意思是指能不能通过什么配置,让服务器的 CPU 只能跑到 95%,预留 5%的资源,不至于出现极端情况,只能重启服务器。
|
13
MeteorCat 2020-12-25 20:23:35 +08:00 1
我看了一下, 可以执行命令 `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 |
14
MeteorCat 2020-12-25 20:25:30 +08:00
上面的方法还是治标不治本, 最好还是利用 `sudo systemd-cgtop` 命令来查看哪个服务器占用最异常再去进行限制
|
15
hatebugs 2020-12-25 20:27:12 +08:00 via Android
感觉这是 xy 问题,确定要要解决的 x 问题,而不是花心思花精力搞 y 问题。
|
16
BrettD 2020-12-25 21:08:35 +08:00 via iPhone
没看懂楼主什么意思,服务器 CPU 为什么要浪费 5%不用呢
|
20
westoy 2020-12-25 21:29:06 +08:00
@symb0l
你如果没手动改抢占模式, 再指定各程序优先级, 这种状况情况不可能出现的, 你让所有核跑 while(1);同时占满, 都可以无障碍登录上去 我目前碰到过无法登录的, 内核挂掉, 只能人工干预; 硬盘挂,WA 100%,登录上去基本动都不能动, 只能人工干预; 被人打爆,SSH 上去直接超时,或者登录后直接卡死, 只能人工干预....... |
21
systemcall 2020-12-25 21:45:42 +08:00
卡死一般是 I/O 爆了不是 CPU 爆了吧,CPU 本来就是有时间切片的,内核没挂应该不至于完全没法响应。I/O 的话,有限制的方法吗?
|
22
BrettD 2020-12-25 22:28:01 +08:00 via iPhone
@symb0l 我没明白浪费 5%的资源怎么能够帮助解决服务器卡死的问题,你自己远程登录的时候不也是和其他程序一起挤那 95%吗
|
23
YouLMAO 2020-12-25 22:38:34 +08:00
.....
我不清楚你的问题, 既然所有用户加起来只能用 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 个用户就跑满了 |
24
msg7086 2020-12-25 22:57:49 +08:00 1
CPU 只能跑到 95%的话,等同于把 CPU 频率降低 5%。
CPU 预留得越多,卡死的概率越大。 |
25
Inn0Vat10n 2020-12-25 23:01:45 +08:00
如果是想全局限制,95%满了和 100%满了不都没区别吗,如果是限制特定进程,cgroup
|
26
geligaoli 2020-12-25 23:42:35 +08:00 1
使用 lxc,性能基本无损失。可以限制 CPU 、内存、硬盘 IO
|
27
ClericPy 2020-12-26 02:10:33 +08:00
就你说的场景, 目前见过的 cgroups docker systemd. 然后 python 启动子进程设置 resource 里的最大虚拟内存, 或者 ulimit 限制虚拟内存的时候, 貌似直接把超标的杀了...
hadoop 上因为虚拟内存超标想限制下都没找到 yarn 里怎么设置唉 |
28
BYF 2020-12-26 08:25:36 +08:00 via Android
用 ulimit,可以临时设置限制,重启后失效。
如果想永久生效,需要修改 /etc/security/limits.conf 但是需要重新启动 |
29
symb0l OP @systemcall 同求 IO 的限制办法
|
30
symb0l OP @BrettD 是的。但是用户不一样,我的意思是能不能预留 5%的资源给 root 用户,不管其它用户对服务器的资源用到什么极端程度,我能暴涨 root 用户能上去管理
|
32
quake0day 2020-12-26 21:50:45 +08:00
同意 @geligaoli 你的这种需求建议上 ESXi 之类的虚拟化平台,把系统创建在虚拟机里,这样可以确保不管哪个超标,你都能登录上管理平台,而且以后直接在网页端就可以维护,也方便。
|
33
BYF 2020-12-26 22:05:36 +08:00
@symb0l 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 直接将新加入的内容用#号注释,重新启动系统后可以使限制失效 例如: #ftp hard nproc 0 |
34
BYF 2020-12-27 00:16:16 +08:00 via Android
@symb0l 啊还有,目前很多软件自身就可以修改占用系统资源的多少。
比如 nginx,可以在配置文件中声明 nginx 可以同时运行多少个进程,每个进程允许有多少个并发连接。 mysql,可以设置服务端占用多少内存资源,最大连接数,和查询速度什么的。 如果服务器收到的正常访问请求太多,建议做负载平衡,而不是限制使用。(需要多台服务器) 那是硬件资源的浪费。 一般在内核没有崩溃的情况下,linux 会响应 SSH 连接。可能比较慢,但还不至于完全卡住。 SSH 完全没反应就 VNC |
35
tkl 2020-12-27 11:57:44 +08:00
@BrettD 那我为什么不能把 openssh 放到那 5%呢?
@systemcall IO 没有那么简单 cgv1 可以限制 direct IO cgv2 可以限制 buffer IO (印象中 看上面的回复,这都有人杠,应该没遇到多租户抢资源吧 |
36
jingniao 2020-12-28 08:19:55 +08:00 via Android 1
服务器卡死一般遇到的是内存不足触发 oom,但因为 oom 也需要内存,所以就卡死,登录不了。
没碰到磁盘 cpu 问题导致无法 ssh 针对内存,我装了 earlyoom 提前杀掉可能会 oom 的进程 |