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…

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

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

怎么清理mysql的死链接_什么是死链接?如何正确处理死链接

什么是死链接?我们应该如何正确处理死链接呢?小刚SEO为你解答。什么是死链接?因链接更改或搜索引擎所收录的网站路径被删除了,形成没法打开的死链接。死链接的危害:1.死链数据过多时,对网站访问体验和用户转…

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

--使用存储过程的数据分页 --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 --分页的第二种方…

mysql generaton_Mysql 集成随机唯一id mysql unique number generation

一句代码:SELECT FLOOR(10000 RAND() * 89999) AS random_numberFROM table1WHERE "random_number" NOT IN (SELECT unique_id FROM table2)LIMIT 1随机生成5位数字,并且不重复。上面的代码真是给人无限的联想力。例如:function g…

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…

mysql 检查点_my05_mysql检查点简述

简单描述一下mysql 检查点&#xff0c;对mysql数据库恢复的理解有所帮助。数据库版本mysql> selectversion();-----------| version() |-----------| 8.0.11 |-----------1 row in set (0.00 sec)检查点查看mysql>show engine innodb status\G;---LOG---Log sequence num…

VS2010无法执行自动化测试解决方案

在实际的工作过程中&#xff0c;当你发现你的VS2010无法执行自动化测试用例&#xff0c;刚好你发现你的电脑安装有VS2012&#xff0c;那么好了&#xff0c;请卸载你的VS2012再试试...转载于:https://www.cnblogs.com/captainR/p/3566751.html

停止Hadoop或HBase集群的脚本

#!/bin/sh #echo "waring" #read NAME #等待用户输入并把输入的值付给NAME NAME$1 #将脚本第一个参数赋给NAME #引用变量时加上"{}",是个好习惯,利于shell辨别变量边界 if [ -z ${NAME} ] ; then #执行脚本没有输入参数,默认关闭hadoopstop-all.sh elif [ …

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、伪…

公钥和私钥 java_公钥与私钥 - yxhxj2006 - BlogJava

评论# re: 公钥与私钥 [未登录]2014-01-08 17:43workeruseful for me 回复 更多评论# re: 公钥与私钥2014-04-18 11:05Eva特别棒&#xff01; 谢谢&#xff01;worker回复 更多评论# re: 公钥与私钥 [未登录]2014-06-11 17:10mike# re: 公钥与私钥2014-11-10 17:05游客太有用…

zepto学习之路--源代码提取

最近在看zepto的源代码&#xff0c;把一些有用的函数摘出来&#xff0c;看看zepto是怎么实现的&#xff0c;自己做的时候也可以用。说实话&#xff0c;zepto的实现有一些看起来还是很晦涩的&#xff0c;可能是自己的水平不够&#xff0c;看不透作者的真正的意图。 1、zepto的正…

java byte 整数_java整数与byte数组的转换实现代码

java整数与byte数组的转换实现代码这里对java中整数与byte数组的转换进行了实现&#xff0c;平时的项目中很少用的到&#xff0c;但是特定需求的时候还是需要的&#xff0c;这里就记录下&#xff0c;亲测可用&#xff0c;实现代码&#xff1a;public class NumberUtil {/*** in…

蓝桥杯 花朵数

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

windows 2003添加删除windows组件中无iis应用程序服务器项的解决方法

解决方法如下: 1.开始 -- 运行,输入 c:\Windows\inf\sysoc.inf,会打开这个文件;在sysoc.inf中找到"[Components]"这一段,并继续找到类 似"iisiis.dll,OcEntry,iis.inf,hide,7" 的一行字,把这一行替换为"iisiis.dll,OcEntry,iis.inf,,7"。如果已经…

java打印菱形代码_Java打印菱形高效简洁代码

importjava.util.Scanner;publicclass打印菱形{publicstaticvoidmain(String[]args){/**菱形**************************/ScannerinputScannernewScanner(System.in);System.out.prin...import java.util.Scanner;public class 打印菱形 {public static void main(String[] arg…

QT mainwindow四件套

最近在学习QT。下面总结一下mainwindow的设置步骤。 使用的平台为vs2013qt5.3.2qt-vs-addin1.2.3 1)安装软件 首先安装vs2013&#xff0c;这个不多介绍。 然后安装qt5.3.2和addin1.2.3。并设置相关环境。详细见http://tieba.baidu.com/p/3451630520?pid61264366864#6126436686…

go mysql recover_golang用panic和recover做业务流程中断的尝试

随着使用golang越来越频繁&#xff0c;发现golang有一个地方非常不方便&#xff0c;就是在错误处理方面。先来看看golang中通常的错误处理方法&#xff1a;通常的error处理package mainimport ("errors""fmt")func a() (err error) {err errors.New("…