linux ll 文件大小单位_该如何改善 Linux 系统性能?

7f84cabd31fe4c79a48cf5c0fb807fdf.png

系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响,并以具体的例子来详细地阐述它在限制资源使用方面的影响。

ulimit 的功能和用法

ulimit功能简述

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配。

不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联系。这时,ulimit可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。ulimit用于限制shell启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。

如何使用ulimit

ulimit通过一些参数选项来管理不同种类的系统资源。在本节,我们将讲解这些参数的使用。

ulimit命令的格式为:

$ ulimit [options] [limit] 

[options]

-H: 设置硬资源限制,一旦设置不能增加。如,ulimit -Hs 64;限制硬资源,线程栈大小为64K。

-S: 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。如,ulimit -Sn 32;限制软资源,32个文件描述符。

-a: 显示当前所有的limit信息。如,ulimit -a;显示当前所有的limit信息。

-c: 最大的core文件的大小, 以blocks为单位。如,ulimit -c unlimited;对生成的core文件的大小不进行限制。

-d: 进程最大的数据段的大小,以Kbytes为单位。如,ulimit -d unlimited;对进程的数据段大小不进行限制。

-f: 进程可以创建文件的最大值,以 blocks 为单位。如,ulimit -f 2048;限制进程可以创建的最大文件大小为2048 blocks。

-l: 最大可加锁内存大小,以Kbytes为单位。如,ulimit -l 32;限制最大可加锁内存大小为32Kbytes。

-m: 最大内存大小,以Kbytes为单位。如,ulimit -m unlimited;对最大内存不进行限制。

-n: 可以打开最大文件描述符的数量。如,ulimit -n 128;限制最大可以使用128个文件描述符。

-p: 管道缓冲区的大小,以Kbytes为单位。如,ulimit -p 512;限制管道缓冲区的大小为512Kbytes。

-s: 线程栈大小,以Kbytes为单位。如,如,ulimit -s 512;限制线程栈的大小为512Kbytes。

-t: 最大的CPU占用时间,以秒为单位。如,ulimit -t unlimited;对最大的CPU占用时间不进行限制。

-u: 用户最大可用的进程数。如,ulimit -u 64;限制用户最多可以使用64个进程。

-v: 进程最大可用的虚拟内存,如,以Kbytes为单位。如,ulimit -v 200000;限制最大可用的虚拟内存为200000Kbytes。

ulimit 使用实例

用户进程的有效范围

ulimit 作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?事实上,ulimit 限制的是当前 shell 进程以及其派生的子进程。举例来说,如果用户同时运行了两个 shell 终端进程,只在其中一个环境中执行了 ulimit -s 100,则该 shell 进程里创建文件的大小收到相应的限制,而同时另一个 shell 终端包括其上运行的子程序都不会受其影响。

Shell 1

$ ll -h newfile 
-rw-r--r--. 1 root root 223K 4月  23 09:16 newfile
$ ulimit -f 100
$ cat newfile > shell1
File size limit exceeded (core dumped)
$ ll -h shell1
-rw-r--r--. 1 root root 100K 4月 23 09:20 shell1

Shell 2

$ cat newfile > shell2
$ ll -d shell2 
-rw-r--r--. 1 root root 227690 4月  23 09:23 shell2
$ ll -h shell2 
-rw-r--r--. 1 root root 223K 4月  23 09:23 shell2

那么,是否有针对某个具体用户的资源加以限制的方法呢?答案是有的,临时生效(不限制打开文件大小限制):

$ ulimit -f unlimited

或通过修改系统的/etc/security/limits.conf配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述,格式如下:

   

domain 表示用户或者组的名字,还可以使用 * 作为通配符。Type 可以有两个值,soft 和 hard。Item 则表示需要限定的资源,可以有很多候选值,如 stack,cpu,nofile 等等,分别表示最大的堆栈大小,占用的 cpu 时间,以及打开的文件数。通过添加对应的一行描述,则可以产生相应的限制。例如:

 * hard noflle 100

该行配置语句限定了任意用户所能创建的最大文件数是 100。现在已经可以对进程和用户分别做资源限制了,看似已经足够了,其实不然。很多应用需要对整个系统的资源使用做一个总的限制,这时候我们需要修改/proc下的配置文件。/proc目录下包含了很多系统当前状态的参数,例如/proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range等等,从文件的名字大致可以猜出所限制的资源种类。由于该目录下涉及的文件众多,在此不一一介绍。有兴趣的读者可打开其中的相关文件查阅说明。

使用ulimit限制shell的内存使用

在这一小节里向读者展示如何使用-d,-m 和-v 选项来对shell所使用的内存进行限制。首先我们来看一下不设置ulimit限制时调用ls命令的情况:

$ ll shell1 -l
-rw-r--r--. 1 root root 227690 4月  23 09:16 shell1

大家可以看到此时的 ls 命令运行正常。下面设置 ulimit:

$ ulimit -d 1000 -m 1000 -v 1000

这里再温习一下前面章节里介绍过的这三个选项的含义:

-d:设置数据段的最大值。单位:KB。

-m:设置可以使用的常驻内存的最大值。单位:KB。

-v:设置虚拟内存的最大值。单位:KB。

通过上面的 ulimit 设置我们已经把当前 shell 所能使用的最大内存限制在 1000KB 以下。接下来我们看看这时运行 ls 命令会得到什么样的结果:

$ ll shell1 -l
Segmentation fault (core dumped)
使用ulimit限制程序所能创建的socket数量

考虑一个现实中的实际需求。对于一个 C/S 模型中的 server 程序来说,它会为多个 client 程序请求创建多个 socket 端口给与响应。如果恰好有大量的 client 同时向 server 发出请求,那么此时 server 就会需要创建大量的 socket连接。但是在 Linux 下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。在 Linux 下创建一个新的socket 连接,实际上就是创建一个新的文件描述符。而Linux对单进程能打开的文件描述符是有限制的,默认单进程能打开的最大文件数量为1024,。ulimit 并没有哪个选项直接说是用来限制socket的数量的。但是,我们有-n这个选项,它是用于限制一个进程所能打开的文件描述符的最大值。如下所示(查看某个进程当前打开的文件描述符信息):

$ ll /proc/36766/fd
总用量 0
lr-x------. 1 root root 64 4月  23 09:31 0 -> /dev/null
l-wx------. 1 root root 64 4月  23 09:31 1 -> /mydata/localhost.localdomain.err
lrwx------. 1 root root 64 4月  23 09:31 10 -> /mydata/ib_logfile1
lrwx------. 1 root root 64 4月  23 09:31 11 -> socket:[115703]
lrwx------. 1 root root 64 4月  23 09:31 12 -> /tmp/ibLxLFBt (deleted)
l-wx------. 1 root root 64 4月  23 09:31 13 -> /mydata/mysql-bin.000001
lrwx------. 1 root root 64 4月  23 09:31 14 -> socket:[115704]
lrwx------. 1 root root 64 4月  23 09:31 15 -> /mydata/mysql/host.MYI
.......................

因此,我们可以通过使用ulimit -n来限制但进程所能打开的最大文件描述符数量,默认单进程打开的文件描述符为1024,就是代表单个进程只能同时最多只能维持1024甚至更少(因为有其它文件的句柄被打开)。如果开启4个进程维持用户链接,那么整个应用能够同时维持的连接数不会超过4*1024个,也就是说最多只能支持4×1024个用户在线。可以增大这个设置以便服务能够维持更多的TCP连接,从而达到限制socket创建的数量。

如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?通过lsof命令可以帮你查看:

$ lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr| head -n 2
    126 7015
     93 1831

上面说明了,7015进程打开了126个文件描述符,你可以通过ps命令看看7015这个进程是什么服务(这里都是以我的举例说明的,你在实验时要根据自己的进程进行查看,相信你有这个意识)。

修改单进程所能打开的最大文件数

1)ulimit -n 102400

这只是在当前终端有效,退出之后,open files又变为默认值。

2)将ulimit -n 102400写到/etc/profile中,这样每次登录终端时,都会自动执行/etc/profile。

3)令修改open files的数值永久生效,则必须修改配置文件:/etc/security/limits.conf在这个文件后加上:

* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000

5月在线免费训练营今日开讲啦!5天运维技术免费学,扫码抢免费听课名额

afd8c4e1bbc7d36f2c6645a25d7a510e.png

如有疑问,速寻达妹微信:zdzc3087880280;达妹QQ:3535503962。

精彩推荐:

  • 拿到认证就奖励1万!这个证对运维来说有多重要?

  • 惊喜!华为认证和红帽认证证书可抵扣个人所得税!

  • 什么是红帽认证?运维拿红帽认证有何优势?

  • 达内教育面向全国用户提供免费课程!(文中申请)

15f0c05a90d8103c30d9f3dda7e03ecc.png

ec10f0dd2c1ecc6a516aaf1e27e43e0f.gif点击“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入Javascript中apply、call、bind

最近在看一下node package的源码,发现很多里面都包含了function这个对象的apply、call、bind这三个方法,于是想拿出来再看看。。 apply、call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context&#x…

优秀案例!教您如何设计现代简约风格网页

我们看到越来越多的设计师开始拥抱简约的网站设计方法,消除网站不必要的元素,保留真正重要的内容,干净、直观的设计,就像今天的我们将展示的这些网站。 下面是一组不同风格的简约设计的网站例子,美丽的导航、整洁的菜单…

数据分页和使用存储过程的数据分页

--使用存储过程的数据分页 --pageSize 一页有多少条 --pageIndex 第几页 --totalCount 总共有多少条 --分页的第一种方法 select top(10) * from Ams_Area where ar_id not in ( Select top(0) ar_id from Ams_Area order by ar_id ) order by ar_id --分页的第二种方…

NavMeshAgent 动态加载障碍物

如果你想让游戏人物绕开一些物体, 这些物体动态生成出来的.只需要给物体添加NavMeshObstacle组件即可 1. 绿色方块添加NavMeshObstacle组件 2. 红色方块没有添加NavMeshObstacle组件,被小球穿透了%>_<% 转载于:https://www.cnblogs.com/plateFace/p/4385629.html

多任务 schedule python_Python3.6 Schedule 模块定时任务 (实例讲解)

Python3.6 Schedule 模块定时任务 (实例讲解)Python 是一种面向对象解释型计算机程序设计语言, 由 Guido van Rossum 于 1989 年底发明, 第一个公开发行版发行于 1991 年 Python 语法简洁而清晰, 具有丰富和强大的类库它常被昵称为胶水语言, 它能够把用其他语言制作的各种模块 …

UVa 11468 (AC自动机 概率DP) Substring

将K个模板串构成一个AC自动机&#xff0c;那些能匹配到的单词节点都称之为禁止节点。 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率。 根据全概率公式用记忆化搜索求解。 1 #include <cstdio>2 #include <cstring>3 #include <queue>4 using name…

css 伪元素分享!!!

最近接触到的css 伪元素觉得还算不错 分享下&#xff1a; 1、清楚内盒浮动设置&#xff1a; .back_list ul{padding:12px 0 0 12px;zoom:1;} .back_list ul:after{clear: both;content: ".";display: block;height: 0;visibility: hidden;}/*清楚内盒浮动设置*/ 2、伪…

蓝桥杯 花朵数

一个N位的十进制正整数&#xff0c;如果它的每个位上的数字的N次方的和等于这个数本身&#xff0c;则称其为花朵数。 例如&#xff1a; 当N3时&#xff0c;153就满足条件&#xff0c;因为 1^3 5^3 3^3 153&#xff0c;这样的数字也被称为水仙花数&#xff08;其中&#xff0…

ROC曲线【转】

ROC曲线&#xff08;Receiver Operating Characteeristic Curve&#xff09;是显示Classification模型真正率和假正率之间折中的一种图形化方法 解读ROC图的一些概念定义&#xff1a; 真正&#xff08;True Positive , TP&#xff09;被模型预测为正的正样本 假负&#xff08;F…

java eclipse oxygen_Eclipse Java Oxygen配置Tomcat

eclipse oxygen 配置tomcat 9.0第一步 装上eclipse的EE插件因为我以前学习java都是用eclipse oxygen的se版本&#xff0c;所以并不支持j2EE&#xff0c;所以第一步&#xff0c;就是要先把它升级为EE版本。有两种方法供我们选择。重新安装eclipse的EE版本。安装eclipse的EE插件。…

java 数组处理_JAVA操作数组

使用 Arrays 类操作 Java 中的数组Arrays 类是 Java 中提供的一个工具类&#xff0c;在 java.util 包中。该类中包含了一些方法用来直接操作数组&#xff0c;比如可直接实现数组的排序、搜索等Arrays 中常用的方法&#xff1a;1、 排序语法&#xff1a; Arrays.sort(数组名);可…

java拆装_JAVA线性表拆解

线性表(List)是一种线性结构。其特点是数据元素直线的线性关系。1.线性表抽象类定义public abstract class AbsList implements Iterable&#xff0c;List{protected int length;abstract public T get(int i); //返回第i(i≥0)个元素abstract public boolean set(int i, T x);…

【BZOJ】【1041】【HAOI2008】圆周上的点

数学 orz hzwer 完全不会做…… 很纠结啊&#xff0c;如果将来再遇到这种题&#xff0c;还是很难下手啊…… 引用题解&#xff1a; 【分析】&#xff1a; 样例图示&#xff1a; 首先,最暴力的算法显而易见&#xff1a;枚举x轴上的每个点&#xff0c;带入圆的方程&#xff0c;检…

【Android】配置APK开发环境

【Android】配置APK开发环境1.安装java jdk去oracle公司下载jdk-7u15-windows-i586.exehttp://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260-zhs.html---C:\Documents and Settings\XXXX>java -versionjava version "1.7.0_15"Ja…

20135127陶俊杰 实验一

北京电子科技学院(BESTI) 《Java程序设计》课实验报告 班 级&#xff1a;201351 姓名及学号&#xff1a;陶俊杰 20135127 指导教师&#xff1a;娄佳鹏 必修/选修&#xff1a;选修 实验日期&#xff1a; 2015年4月16日 实验时间&…

Google Code Jam 2015 Round 1A Haircut 二分

题意&#xff1a;给你每个理发师的理发时间&#xff0c;问你排在队列中的第N个位置&#xff0c;问你应该被哪个理发师剪发。 解题思路&#xff1a;二分时间&#xff0c;看这个时间到第几个人理发了&#xff0c;然后找到临界值&#xff0c;看这个值的时候有那些理发师接待了新旅…

Base64 百科词条

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64&#xff0c;所以每6个位元为一个单元&#xff0c;对应某个可打印字符。三个字节有24个位元&#xff0c;对应于4个Base64单元&#xff0c;即3个字节需要用4个可打印字符来表示。它可用来作为电子…

java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划

好程序员Java学习路线之MySQL的执行计划。什么是执行计划&#xff1f;执行计划通常是开发者优化SQL语句的第一步。MySQL在解析SQL语句时&#xff0c;会生成多套执行方案&#xff0c;然后内部会进行一个成本的计算&#xff0c;然后通过优化器选择一个最优的方案执行&#xff0c;…

Web系统开发构架再思考-前后端的完全分离

前言 前后端完全分离其实一直是Web开发人员的梦想,也一直是我的梦想,遥想当年,无论是直接在代码里面输出HTML,还是在HTML里面嵌入各种代码,都不能让人感到满意.期间的痛苦和纠结,我想所有Web开发人员都深有感触. 由于最近几年一直在MS平台,从Web Form到MVC,MS平台虽然易用好学,…