IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux ulimit 调优 -> 正文阅读

[系统运维]linux ulimit 调优

在 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码农,获取更多干货

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 16:20:37  更:2021-12-18 16:21:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:29:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码