在 Linux 系统中,在每个进程中都有一组资源限制,进程默认打开的最大文件数个数为 1024 个,可以通过如下配置查看:

#ulimit -n
1024

在应用程序开发过程中,比如向 server 发起连接的客户端超过 1024 个时,server 由于 1024 个最大的文件个数限制而出现打开文件失败,进而出现Too many open files 错误。

在linux中这些限制是分为软限制 (soft limit) 和 硬限制 ( hard limit )。他们的区别就是软限制可以在程序的进程中自行改变(突破限制),而硬限制则不行(除非有 root 权限)。

软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值。

硬限制充当软限制的上限:非特权进程只能将其软限制设置为从 0 到硬限制的范围内的值,只有超级用户进程可以提高硬限制的值。

任何一个进程都可以降低其硬限制的值,但它必须大于或等于其软限制的值。

查看软限制的命令

#ulimit -Sn
1024

查看硬限制的命令

#ulimit -Hn
4096

那么如何设置这些限制呢?

1、可以通过 getrlimit 和 setrlimit 系统调用的方式进行获取和设置资源限制。

#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

对于这 2 个函数的每一次调用都会指定一个资源以及一个指向下列结构的指针。

struct rlimit {
rlim_t rlim_cur; /* Soft limit /
rlim_t rlim_max; /
Hard limit (ceiling for rlim_cur) */
};

比如在应用程序启动过程中,通过调用 setrlimit 的方法进行设置。

struct rlimit rlim;

rlim.rlim_cur = 5000;
rlim.rlim_cur = 5000;

if(setrlimit(RLIMIT_NOFILE, &rlim) != 0)
{
printf(“failed to set rlimit for open files\n”);
return 0;
}

2、可以在启动服务脚本中进行设置

#!/bin/bash

ulimit -c unlimited
ulimit -n 5000

./exec &

对于通过命令行修改的 ulimit 配置是临时生效的。

3、也可以修改配置文件(永久生效),如下

#vi /etc/security/limits.conf

//在文件末尾添加如下2行

  • soft nofile 5000
  • hard nofile 5000

配置完后,重启系统,使之生效。

4、当服务已经启动时,这个时候修改 unlimt 是无效的,可以通过如下命令进行动态调整

// centos 7 环境

1、通过ps命令获取服务的pid

2、先查看其配置信息
#cat /proc/{pid}/limits

Max open files 5000 5000 files

3、修改配置
//centos 7 下
prlimit --nofile=6000:6000 --pid {pid}

//centos 6 下
echo -n “Max open files=6000:6000” > /proc/{pid}/limits

setrlimit 原理分析

接下里通过源码的方式进行分析下当使用 setrlimit 系统调用设置最大打开文件个数时发生了什么。

asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim)
{
struct rlimit new_rlim, *old_rlim;
unsigned long it_prof_secs;
int retval;

    if (resource >= RLIM_NLIMITS)return -EINVAL;if (copy_from_user(&new_rlim, rlim, sizeof(*rlim)))return -EFAULT;if (new_rlim.rlim_cur > new_rlim.rlim_max)return -EINVAL;//获取旧的资源配置old_rlim = current->signal->rlim + resource;if ((new_rlim.rlim_max > old_rlim->rlim_max) &&!capable(CAP_SYS_RESOURCE))return -EPERM;if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > NR_OPEN)return -EPERM;...task_lock(current->group_leader);//把新的配置设置上去*old_rlim = new_rlim;task_unlock(current->group_leader);if (resource != RLIMIT_CPU)goto out;...

out:
return 0;
}

该方法就是把新的配置信息替换掉当前进程旧的资源限制信息。

当系统打开一个文件时,需要获取一个未使用的文件描述符,其过程如下

int get_unused_fd_flags(int flags)
{
struct files_struct * files = current->files;
int fd, error;
struct fdtable *fdt;

    error = -EMFILE;spin_lock(&files->file_lock);

repeat:
fdt = files_fdtable(files);
//查找一个未使用的文件描述符
fd = find_next_zero_bit(fdt->open_fds->fds_bits, fdt->max_fds,
files->next_fd);

    /** N.B. For clone tasks sharing a files structure, this test* will limit the total number of files that can be opened.*/// 查看描述符是否超过资源限制,返回错误if (fd >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)goto out;/* Do we need to expand the fd array or fd set?  *///根据fd进行判断是否需要扩展文件描述表error = expand_files(files, fd);if (error < 0)goto out;if (error) {/** If we needed to expand the fs array we* might have blocked - try again.*/error = -EMFILE;goto repeat;}//设置fd的使用标志FD_SET(fd, fdt->open_fds);...error = fd;

out:
spin_unlock(&files->file_lock);
return error;
}

从上述代码可知,每当打开一个文件时,都会判断打开的文件描述符是否超过资源限制,若超过资源限制,则返回失败,错误码为 Too many open files。

原文链接
linux ulimit 调优

欢迎关注公众号 Linux码农,获取更多干货

linux ulimit 调优相关推荐

  1. linux ulimit调优

    1,说明: ulimit用于shell启动进程所占用的资源. 2,类别: shell内建命令 3,语法格式: ulimit [-acdfHlmnpsStvw] [size] 4,参数介绍: -H 设置 ...

  2. Linux性能调优用这个“必杀技”,稳了!

    " "这个系统好慢.网站又打不开了,太卡了,又没响应了!"相信大家都遇到过这种抱怨,这是应用系统出现了性能问题,需要性能调优. 性能调优,要求对计算机硬件.操作系统和应用 ...

  3. Linux系统调优详解(十二)——IO调优之磁盘测速

    今天继续给大家介绍Linux运维相关知识,本文主要内容是IO调优,测试对磁盘的速度. 在进行Linux系统调优的时候,我们需要对当前系统的硬盘读写速度进行测试.此时,我们可以选择使用hdparm命令或 ...

  4. 关于Linux性能调优之内存负载调优

    写在前面 整理一些Linux内存调优的笔记,分享给小伙伴 博文没有涉及的Demo,理论方法偏多,可以用作内存调优入门 博文内容涉及: Linux内存管理的基本理论 寻找内存泄露的进程 内存交换空间调优 ...

  5. 线上Linux服务器调优经验与技巧-高俊峰-专题视频课程

    线上Linux服务器调优经验与技巧-6175人已学习 课程介绍         本课程从Linux服务器的安装.配置.管理.维护.调优等多个方面介绍对线上服务器的优化思路和技巧,在授课方面更注重经验和 ...

  6. linux性能调优看这篇就懂,[转载]Linux性能调优

    译注:本文译自linuxforums.org上的一篇文章<Linux Performance Tuning>(原文作者Fernando Apesteguia发表于2006年)翻译此文仅为英 ...

  7. linux性能调优命令精华

    linux性能调优命令精华 2010年07月18日 linux性能调优命令精华 时间:2010-6-23 一. 查看硬盘读取速度 命令:hdparm -t /dev/sda5 打印:Timing bu ...

  8. 大战C100K之-Linux内核调优篇--转载

    原文地址:http://joyexpr.com/2013/11/22/c100k-4-kernel-tuning/ 早期的系统,系统资源包括CPU.内存等都是非常有限的,系统为了保持公平,默认要限制进 ...

  9. linux内核优化策略,linux系统调优小结

    关于安全系统的调优: 1.关闭selinux安全策略 sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/sysconfig/selinux for ...

最新文章

  1. java 字节码对象_获得类的字节码对象的三种方式
  2. 计组之数据运算:12、加法器设计
  3. MyBatis框架 多表联合查询实现
  4. Spring Cloud微服务系列-Eureka Client源码解析(二)
  5. 零基础转行Linux云计算运维工程师获得20万年薪的超级学习技巧
  6. 桌面版docker操作_10分钟快速掌握Docker必备基础知识
  7. 暂无支持此机型的手机版本_miui+app官方版-miui+安卓版 _5577安卓网
  8. 设备驱动模型与sysfs
  9. 前端性能优化的常用手段
  10. Mariadb 安装 启动 及错误 1067 问题解决
  11. bandizip修改压缩文件内容_BandiZip如何进行解压缩文件?BandiZip解压缩流程
  12. Secondary NameNode工作原理
  13. Final发布中间产物
  14. qq小程序开发者工具无法编写代码
  15. halcon算子中文对照
  16. python画正方形-用python画正方形
  17. python爬虫,g-mark网站图片数据爬取及补坑
  18. 职称评审被淘汰的诸多原因,可以赶紧为2022年评职称做准备
  19. 我用 10 张脑图,征服了一系列大厂面试官。
  20. GPS标准历书Yuma,Rinex,TLE,SEM是什么意思?

热门文章

  1. PMP忘记续证了这样解决
  2. kb4023057安装失败_Windows 10重新发布:出现0x80070643错误无法安装 - 里维斯社
  3. 如何批量创建word文档并重命名?
  4. 数一 、数二和数三,到底有何区别?
  5. excel 第6讲:认识数据透视表
  6. 随机强化:为什么大多数交易者会失败
  7. hadoop集群搭建总结
  8. Java性能监控之操作系统层面
  9. java的依赖注入_Java依赖注入的三种方式
  10. Python实现将快手个人主页的视频进行无水印下载