V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
symb0l
V2EX  ›  Linux

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

  •  1
     
  •   symb0l · 2020-12-25 19:30:44 +08:00 · 5261 次点击
    这是一个创建于 1431 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    37 条回复    2020-12-28 16:50:10 +08:00
    symb0l
        1
    symb0l  
    OP
       2020-12-25 19:31:31 +08:00
    通过内核配置可以限制吗?
    aheadlead
        2
    aheadlead  
       2020-12-25 19:33:12 +08:00 via iPhone
    cgroup
    symb0l
        3
    symb0l  
    OP
       2020-12-25 19:35:13 +08:00
    @aheadlead 谢谢回复,用 cgroup 限制应用访问资源么,有点麻烦耶,我的意思是怎么配置,例如服务器的 CPU 只能跑到 95%,预留 5%的资源,大佬有这种设置吗?
    taogen
        4
    taogen  
       2020-12-25 19:35:23 +08:00   ❤️ 5
    看头像就进来了
    MeteorCat
        5
    MeteorCat  
       2020-12-25 19:35:56 +08:00 via Android
    systemctl 有配置选项,你按照启动脚本加上 MemoryHigh,MemoryMax,还有 CPU 配置选项,这玩意特别有用,在搭建镜像拉取节点服务的时候防止占用过高特别有用
    westoy
        6
    westoy  
       2020-12-25 19:36:00 +08:00
    cgroup 限制容器或者虚拟机的资源

    其实没必要预留
    就算高负载运转, 不是极端情况不至于登不上
    但是万一你被人打到端口都堵了, 丢包丢的稀里哗啦的, 资源预留也基本登不上了......

    这种情况,VPS 一般有 VNC, 物理机有 IPMI 、KVM over IP, 实在啥也没有让机房的人帮你重启一下
    symb0l
        7
    symb0l  
    OP
       2020-12-25 19:36:17 +08:00
    @taogen 守望 PG......
    MeteorCat
        8
    MeteorCat  
       2020-12-25 19:36:35 +08:00 via Android
    具体可以参照官方手册,但是要求你 linux 守护程序是 systemctl
    symb0l
        9
    symb0l  
    OP
       2020-12-25 19:38:34 +08:00
    @MeteorCat 谢谢大佬,但这种都是限制某个服务的,我的意思是指能不能通过什么配置,让服务器的 CPU 只能跑到 95%,预留 5%的资源,不至于出现极端情况,只能重启服务器。
    symb0l
        10
    symb0l  
    OP
       2020-12-25 19:39:19 +08:00
    @westoy 谢谢大佬,我没表达清楚,我的意思是指能不能通过什么配置,让服务器的 CPU 只能跑到 95%,预留 5%的资源,不至于出现极端情况,只能重启服务器。
    MeteorCat
        11
    MeteorCat  
       2020-12-25 19:41:13 +08:00 via Android
    @symb0l 我记得可以用 systemctl 对服务切片限制的,我看看手册
    symb0l
        12
    symb0l  
    OP
       2020-12-25 19:42:33 +08:00
    @MeteorCat 好咧,坐等大佬~
    MeteorCat
        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
    MeteorCat
        14
    MeteorCat  
       2020-12-25 20:25:30 +08:00
    上面的方法还是治标不治本, 最好还是利用 `sudo systemd-cgtop` 命令来查看哪个服务器占用最异常再去进行限制
    hatebugs
        15
    hatebugs  
       2020-12-25 20:27:12 +08:00 via Android
    感觉这是 xy 问题,确定要要解决的 x 问题,而不是花心思花精力搞 y 问题。
    BrettD
        16
    BrettD  
       2020-12-25 21:08:35 +08:00 via iPhone
    没看懂楼主什么意思,服务器 CPU 为什么要浪费 5%不用呢
    symb0l
        17
    symb0l  
    OP
       2020-12-25 21:24:50 +08:00
    @hatebugs 主要目前现在 x 问题,会突发,不想在 x 问题发生的时候太过于变动
    symb0l
        18
    symb0l  
    OP
       2020-12-25 21:25:27 +08:00
    @BrettD 预留资源,在极端情况下,,,不至于连登录服务器查问题都做不了嘛
    symb0l
        19
    symb0l  
    OP
       2020-12-25 21:25:47 +08:00
    @MeteorCat 感谢大佬,学习 ing
    westoy
        20
    westoy  
       2020-12-25 21:29:06 +08:00
    @symb0l

    你如果没手动改抢占模式, 再指定各程序优先级, 这种状况情况不可能出现的, 你让所有核跑 while(1);同时占满, 都可以无障碍登录上去

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

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

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



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


    看上面的回复,这都有人杠,应该没遇到多租户抢资源吧
    jingniao
        36
    jingniao  
       2020-12-28 08:19:55 +08:00 via Android   ❤️ 1
    服务器卡死一般遇到的是内存不足触发 oom,但因为 oom 也需要内存,所以就卡死,登录不了。
    没碰到磁盘 cpu 问题导致无法 ssh
    针对内存,我装了 earlyoom 提前杀掉可能会 oom 的进程
    BrettD
        37
    BrettD  
       2020-12-28 16:50:10 +08:00
    @tkl 楼主可没这么说
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.