美文网首页
Linux 操作系统中nproc的值如何得出?

Linux 操作系统中nproc的值如何得出?

作者: 前浪浪奔浪流 | 来源:发表于2022-07-06 09:52 被阅读0次

    nproc hard的默认值是如何得到的?

    一台1C2G的RHEL6版本虚拟机,用于制作虚拟机模板,在/etc/security/limits.d/90-nproc.conf修改了用户nproc的soft值,如下:


    image.png

    该配置设置了root用户的nproc的soft值为ulimited,其他用户的nproc的soft值为10240。然而当检查每个用户的nproc值的时候惊奇地发现用户的nproc的hard和soft值均为7387,如下:


    image.png

    这个值很奇怪,用户nproc的soft和hard值并不是10240,但是在其他主机上这个配置能够达到预期的值。经过分析,上面的配置中由于并没有设置用户nproc的hard值,导致用户nproc的soft值受到hard值的限制,取不到预期的值,因此关键问题需要搞清楚hard值是由哪个因素决定的。推断nproc的hard值是在内核获取到的,所以翻看了内核代码,果然在内核代码fork.c中发现端倪:


    image.png

    其中mempages是物理内存页的个数,PAGE_SIZE(内存页大小)为4K,THREAD_SIZE(线程栈大小)x86平台是16K,所以最后默认的nproc值为:

    default_nproc = max_threads/2

    = MemTotal(KB) / 256(KB)

    即默认nproc大小取决于主机内存大小。在笔者2G内存(实际虚拟机内存为1877M,Hypervisor管理虚拟机有内存开销)的虚拟机上,计算一下:

    default_nproc = 1877*1024/256 = 7508

    由于kernel会占用一部分的内存,实际的nproc(本例中为7387)要比计算值稍小一些。笔者的案例中仅仅设置了用户nproc的soft值,所以用户的nproc的soft值被限制在default_nproc。因此上面例子中有两种解决方法:

    1. 评估需求,用户的nproc要是少于7387的话,就降低;

    2. 在配置文件中,设置上用户nproc的hard值为10240,通过提升hard值来满足预期。

    因此各位看官今后要根据主机内存配置合理地设置用户nproc的值。

    linux max_threads参数计算

    内核threads线程数是一定的,具体是跟机器内存有关系
    部分参数获取方法
    PAGE_SIZE:getconf PAGE_SIZE 单位byte 页的大小 4096即4K
    THREAD_SIZE:ulimit -s 8192 线程栈大小,以KB为单位,即8192K,8M

    额定具体计算如下
    max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8

    mempages是物理内存页的个数;
    mempages计算
    mempages = 物理内存大小 ÷ PAGE_SIZE

    例如:32G理论内存 实际查看只有 32174M
    mempages = 32174 * 1024 * 1024/4*1024 = 8236544 物理内存页的个数

    max_threads = 8236544/[(81024)/(41024)]/8 = 514784

    因为为了保证每个用户进程总数不至于超过一半内存fork_init()指定:
    init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
    init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

    即物理额定线程数为514784/2=257392
    查看系统当前最大线程数

    cat /proc/sys/kernel/threads-max
    252574
    free -m
                  total        used        free      shared  buff/cache   available
    Mem:          31596       24180         317           3        7098        6869
    

    31596(M)1024/4=8088576(页数)
    理论最大线程=8088576(页数)/[(8
    1024)/(4*1024)]/8=505536
    实际上内存不能都用来启动线程,所以实际最大线程是理论最大线程的1/2稍小一些(内核运行也会占用一些线程)
    理论计算值 505536/2=252768
    实际值 252574
    链接:https://www.jianshu.com/p/3726af3c9771

    相关文章

      网友评论

          本文标题:Linux 操作系统中nproc的值如何得出?

          本文链接:https://www.haomeiwen.com/subject/gagebrtx.html