当前位置: 首页 > 科技观察

Linux下的一些资源限制

时间:2023-03-14 12:16:00 科技观察

前言我们在写程序的时候,往往没有注意到一些系统资源的临界值。然而,这些临界值有时会严重伤害我们,比如我们忘记关闭Descriptor的文件,比如malloc,会返回错误,或者爆栈。我们如何解决或预防这些问题?以下实验只在本地系统环境下生效:用户级资源限制ulimit命令可以查看用户级系统资源限制。这是/etc/security/limits.conf中的描述:--------------------------------------------------该文件为通过PAM登录的用户设置资源限制。它不影响系统服务的资源限制。另请注意,/etc/security/limits.d目录中的配置文件按字母顺序读取内容,请覆盖此设置以使用相同或更多特定文件。例如,这意味着在这里设置通配符域限制可以覆盖配置文件中具有通配符设置的子目录,但此处的用户特定设置只能被子目录中的用户特定设置覆盖。-------------------------------------------------所以ulimit确实在观察用户级别的资源限制。我们可以通过ulimit-a查看我们所有的资源限制:只有我们比较关心的:-sstacksize:8MB-uprocesslimit:morethan30,000-nfiledescriptorlimit:1024同时可以使用ulimit-Ha或ulimit-Sa查看硬限制和软限制,硬限制是指资源节点和数据块的绝对限制,硬限制由root用户设置。虽然其他用户可以降低硬限制,但只有root用户可以增加硬限制。至于软限制,网上也没有说什么,大概是非root用户不能超过软限制,但非root用户可以做的是将软限制增加到硬限制。我们的服务器程序可能会打开超过1024个文件描述符。有没有办法修改这些资源的上限?例如。ulimit-n1024可以修改系统对文件描述符的限制,但对当前shell暂时有效。如果你使用whichulimit,你会发现ulimit是一个shell内置的命令脚本。我们应该修改/etc/security/limits.conf以使我们的更改永久生效。(需要重启,可能有直接加载配置的方法,暂时不知道)实验一、修改文件描述符的上限在/etc/security/limits中添加如下片段.conf:重启后查看资源是否真的被阻塞Modified:表示修改成功。那么现在我们来测试一下我们的程序是否可以打开这么多的文件描述符?做个小测试,下面是打开10240个临时文件,这里我们期待错误EFILE:然后我们看结果:修改前ulimit默认值为1024,然后测试最大打开文件描述符数是1001,现在修改为10240后,可以打开10217个文件描述符,实验成功。那为什么我们能打开的总数不正好是10240呢?这个问题是因为程序本身打开了一些文件或者加载了一些动态库,stdin/stdout/stderr,和/etc/ld.so.cache,/usr/lib/libm.so.6,/usr/lib/libstdc++。so.6...实验2.修改栈空间上限在/etc/security/limits.conf中也加入这两句:然后在c程序中测试栈帧的上限:程序正常.将堆栈调整到一个临界值:程序段错误。但是这里我们只能保守的说:调整后一个进程的栈空间大约为8192000B。系统级资源限制单个进程打开的文件句柄数量上限文件描述符最大数量为10亿。系统分配的pid上限是400万以上。file-max是内核级别强制执行的最大文件描述符(FD),上限为600万。已分配的文件描述符数、已分配但未使用的文件描述符数、最大文件描述符数(不可调整)。系统中的线程总数限制为60,000。单个程序可以使用的内存映射空间数为60,000。可以创建的线程总数与这些有关:一个进程的资源限制Redis中文件描述符上限的调整你以为资源限制与你无关吗?当你打开redis-server的时候,有没有注意到这样一段话:Increasedmaximumnumberofopenfilesto10032(原来设置为1024)。其含义是将文件描述符从默认的上限调整为10032,以容纳更多的网络连接。它的源码只是调用了api:setrlimit(RLIMIT_NOFILE,&limit)来临时调整资源上限,这里不再赘述。最后,prlimit介绍另一个类似ulimit的命令prlimit:结束语linux的资源限制不能说是惊人的,但是确实值得做linux服务器编程的程序员关注。同时,我们可以通过传入/etc/security/limits.conf来修改资源上限。突然想到上次问前辈们:Linux下为什么要限制这些资源?都调成ulimited不是很好吗?可以说我们的linux机器之所以限制这些资源的上限,是希望我们能够充分利用它,最大限度地发挥它的性能,而不是让CPU或者文件等资源闲置在那里,浪费生命的电脑。