Linux 服务器怎么预留资源(CPU、内存、IO 等)

2020-12-25 19:30:44 +08:00
 symb0l

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

5003 次点击
所在节点    Linux
37 条回复
systemcall
2020-12-25 21:45:42 +08:00
卡死一般是 I/O 爆了不是 CPU 爆了吧,CPU 本来就是有时间切片的,内核没挂应该不至于完全没法响应。I/O 的话,有限制的方法吗?
BrettD
2020-12-25 22:28:01 +08:00
@symb0l 我没明白浪费 5%的资源怎么能够帮助解决服务器卡死的问题,你自己远程登录的时候不也是和其他程序一起挤那 95%吗
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 个用户就跑满了
msg7086
2020-12-25 22:57:49 +08:00
CPU 只能跑到 95%的话,等同于把 CPU 频率降低 5%。
CPU 预留得越多,卡死的概率越大。
Inn0Vat10n
2020-12-25 23:01:45 +08:00
如果是想全局限制,95%满了和 100%满了不都没区别吗,如果是限制特定进程,cgroup
geligaoli
2020-12-25 23:42:35 +08:00
使用 lxc,性能基本无损失。可以限制 CPU 、内存、硬盘 IO
ClericPy
2020-12-26 02:10:33 +08:00
就你说的场景, 目前见过的 cgroups docker systemd. 然后 python 启动子进程设置 resource 里的最大虚拟内存, 或者 ulimit 限制虚拟内存的时候, 貌似直接把超标的杀了...

hadoop 上因为虚拟内存超标想限制下都没找到 yarn 里怎么设置唉
BYF
2020-12-26 08:25:36 +08:00
用 ulimit,可以临时设置限制,重启后失效。
如果想永久生效,需要修改 /etc/security/limits.conf
但是需要重新启动
symb0l
2020-12-26 15:32:11 +08:00
@systemcall 同求 IO 的限制办法
symb0l
2020-12-26 15:33:18 +08:00
@BrettD 是的。但是用户不一样,我的意思是能不能预留 5%的资源给 root 用户,不管其它用户对服务器的资源用到什么极端程度,我能暴涨 root 用户能上去管理
symb0l
2020-12-26 15:34:08 +08:00
@BYF ulimit 能限制 IO 这些吗?
quake0day
2020-12-26 21:50:45 +08:00
同意 @geligaoli 你的这种需求建议上 ESXi 之类的虚拟化平台,把系统创建在虚拟机里,这样可以确保不管哪个超标,你都能登录上管理平台,而且以后直接在网页端就可以维护,也方便。
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
BYF
2020-12-27 00:16:16 +08:00
@symb0l 啊还有,目前很多软件自身就可以修改占用系统资源的多少。
比如
nginx,可以在配置文件中声明 nginx 可以同时运行多少个进程,每个进程允许有多少个并发连接。
mysql,可以设置服务端占用多少内存资源,最大连接数,和查询速度什么的。
如果服务器收到的正常访问请求太多,建议做负载平衡,而不是限制使用。(需要多台服务器)
那是硬件资源的浪费。

一般在内核没有崩溃的情况下,linux 会响应 SSH 连接。可能比较慢,但还不至于完全卡住。
SSH 完全没反应就 VNC
tkl
2020-12-27 11:57:44 +08:00
@BrettD 那我为什么不能把 openssh 放到那 5%呢?



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


看上面的回复,这都有人杠,应该没遇到多租户抢资源吧
jingniao
2020-12-28 08:19:55 +08:00
服务器卡死一般遇到的是内存不足触发 oom,但因为 oom 也需要内存,所以就卡死,登录不了。
没碰到磁盘 cpu 问题导致无法 ssh
针对内存,我装了 earlyoom 提前杀掉可能会 oom 的进程
BrettD
2020-12-28 16:50:10 +08:00
@tkl 楼主可没这么说

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739016

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX