Linux_配置_环境变量和资源限制

环境变量配置

在Linux 中,环境变量的设置需要修改 /etc/profile 配置文件,然后 source /etc/profile 使其生效。


vim /etc/profile

export JAVA_HOME=/usr/local/jdk-1.8.0
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile

Linux 为了方便环境变量的管理,提供了一种更加优雅的方式。即在 /etc/profile.d/ 文件夹下面新建 .sh 文件。

[root@datacenter01 ~]# cd  /etc/profile.d/
[root@datacenter01 profile.d]# ll
-rw-r--r--  1 root root 1047 Jun 11  2021 java.sh
-rw-r--r--  1 root root  139 Apr 29  2020 hadoop.sh

/etc/profile.d/ 的原理是,/etc/profile文件中有如下一段脚本:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

在每次启动时,自动加载并执行/etc/profile.d 下的*.sh,让*.sh中配置的变量生效。

/etc/profile.d/*.sh 与/etc/profile相比:

1、都是用来设置环境变量的文件;
2、都是设置登录(login)级别的变量,当用户重新登录 shell 时会触发;所以效果一致;
3、source /etc/profile也都会生效。

/etc/profile.d/ 的唯一好处是,方便管理。这个也是生产环境最常用的方式。

资源限制

在Linux 操作系统中,Linux会对每个用户或者是在整个系统层面限制其最大进程数、打开文件句柄数…

其实在生产环境中部署Linux后通常都会去调整一些系统限制参数来交付使用,当然这个过程往往都是自动完成的。

Linux支持各种类型的限制,常用的有:


内核文件的大小限制

进程数据块的大小限制

Shell进程创建文件大小限制

可加锁内存大小限制

常驻内存集的大小限制

打开文件句柄数限制

分配堆栈的最大大小限制

CPU占用时间限制

用户最大可用的进程数限制

Shell进程所能使用的最大虚拟内存限制

在Linux 限制包括软性限制和硬性限制两种;软性极限值表示超过这个极限值,系统会发出警告,硬性极限值是实际的显示。所以软性极限值无论如何要小于等于硬性极限值。

session 级别资源限制(ulimit)

ulimit是Linux内置的一个性能调优工具,它的目的是用于控制由Shell运行的进程所能使用的系统最大资源。

ulimit用于限制shell启动进程所用的资源,内核文件大小、进程数据块大小、shell进程创建的文件大小、内存锁住大小、最大可用内存大小、最大可用虚拟内存大小、最大文件描述符大小、CPU时间、分配堆栈大小、单个用户的最大线程数量。它支持硬限制和软限制。

上面提到【限制shell】启动进程, 其实这也就表明了它的作用范围,它不是用来限制系统的,仅仅是用来限制当前登录shell的用户所启动的进程的。临时调整参数的话仅对当前shell有效,关闭则失效,同时不影响其他shell; 如果需要永久生效,则请使用用户级别资源限制。


# 1、设置进程可以打开的最大文件描述符数量
#    该设置只是在当前的session中有效
ulimit -n 524288  

# 2、查看所有限制,如果不加-H参数则默认显示软限制。
ulimit -a    
[root@datacenter03 bin]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 512666
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 524288
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 131072
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited



上面的2个例子只是ulimit的简单使用,其具体参数如下:


-H	设置硬限制, ulimit -Hn 1024 表示硬限制,限制最大文件描述符为1024。硬限制是绝对不能超过这个值。

-S	设置软限制,ulimit -Sn 1024  表示软限制,限制最大文件描述符为1024,软限制不能大于硬限制,在不超过硬限制的前提下,可以超过软限制使用一段时间。超过该时间就自动清除。

-a	显示当前所有的限制信息,默认为软限制。

-c	最大的core文件大小,以blocks为单位。块大小取决于你系统分区使用的块为多大。

-d  进程占用的最大数据段大小,以bytes为单位。

-f  进程可以创建的单个文件为多大,以blocks为单位。ulimit -f 100 限制进程最大可以创建100块大小的文件。

-i	可以被挂起或者阻塞的最大信号数量。

-l	最大可加锁内存大小,以bytes为单位。这个值对普通用户生效,对管理员不起作用。不过有一个知识需要了解,就是为什么要对内存加锁?抛开虚拟地址空间不说,总之进程和数据都会在物理内存中,只要进程和数据当前都是活动的。不过我们也知道,内存管理有换进换出机制,采用最近最少原则,这些数据暂时性的交换到SWAP分区中,也就是虚拟内存中,而在需要的时候在交换进物理内存。内存加锁就是将数据锁定在物理内存中,避免换进换出。这样可以提高效率,对某些应用需要这样设置,比如数据库、或者对安全性要求高的,但大部分不需要。所以这个参数就是设定进程最大可以锁定多少内存。

-m  进程可用的最大内存数量,以bytes为单位。很多系统设置无效。

-n  进程可以打开的最大文件描述符数量,也就是一个进程可以最多打开多少个文件。

-p  管道缓冲区大小,以bytes为单位。

-q	限制程序使用POSIX消息队列的最大值。

-r	限制程序的实时优先级范围,只针对普通用户有效。

-s  线程栈大小,以bytes为单位。

-t  进程最多可以占用CPU多久,以秒为单位。

-u  用户最大可运行的进程数,只针对普通用户有效。

-v  进程最多可用多少虚拟内存,以bytes为单位。

用户级别资源限制

修改 /etc/security/limits.conf 文件,不过推荐在 /etc/security/limits.d/ 下建立一个.conf的文件在这里写。这样便于管理。在limits.conf文件中有书写格式,参照该格式写就可以。这种方式不但可以对用户进行限制还可以对用户组进行限制。


[root@datacenter03 limits.d]# cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

#*          soft    nproc     4096
root       soft    nproc     unlimited
* soft nofile 524288
* hard nofile 524288
* soft nproc 131072
* hard nproc 131072

说明:

1、 * 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数。
2、soft 表示软性极限, hard 表示硬性极限。


系统级别资源限制

下面这个命令是查看当前系统可以打开多少文件描述符,以及目前使用了多少。


[root@datacenter03 limits.d]# cat /proc/sys/fs/file-nr
7360    0       13005118

说明:7360: 当前使用了多少;  0: 回收了多少;  13005118: 当前系统总共可以打开多少。

[root@datacenter03 limits.d]# cat /proc/sys/fs/file-max
13005118

说明: 查看系统最大可以打开多少文件描述符,这个值和上面的最后一个值相等。

file-max显然比ulimit -n的值多,这就是它们的区别,file-max表示当前系统可以打开的最大文件数量,它包括所有用户和所有进程,而ulimit -n只是显示当前用户或者说是进程级别可以打开的数量。它们是在不同层次。如果你要修改系统级别的资源限制,就要修改/etc/sysctl.conf文件。

比如fs.file-max=65536 把这个写入到这个文件,那么系统的最大文件描述符数量就是65535了。最后使用sysctl -p使其生效。


# 限制系统当前所有的限制值
sysctl -a 

[root@datacenter01 ~]# cat /etc/sysctl.conf | grep file
fs.file-max=65535


这是一个很有趣的现象,我们发现 lsof 和 file-nr 统计打开的文件句柄数量是不一致的:

# cat /proc/sys/fs/file-max  
1106537  
# cat /proc/sys/fs/file-nr       
1088  0       1106537  
# lsof | wc -l  
1506

why? 这是因为写到 lsof 是列出系统所占用的资源,但是这些资源不一定会占用打开文件句柄的。如共享内存,信号量,消息队列,内存映射… 虽然占用了这些资源,但不占用打开文件号。

我曾经在前端机上很长时间都无法得到lsof | wc -l 的结果,这个时候可以通过file-nr粗略的估算一下打开的文件句柄数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值