bookmark_border怎样增大 Linux 系统的 open file(s) 上限

最近在工作中遇到一个问题,尝试直接将服务运行在高配(40core, 192GB;相比虚拟机来说) 的物理机上,但是发现服务打开的文件句柄达到 80 万左右就不能再开更多了。

80 万已经是一个不小的值了,通常情况下,Linux 默认的值都很小,例如:Debian 8(jessie) 给普通用户设置的 open file(s) 限制为 65536, 可以通过下面的命令查看当前限制。

$ ulimit -n
$ ulimit -Sn
$ ulimit -Hn

ulimit 是一个 shell(这里使用的是 bash) 内置命令,可以通过 type ulimit 验证。

-n 即表示查看或者设置 open file(s) 的限制,在 ulimit 中,每个限制都有两种类型:

  • -S, soft limit, 软限制,用户可以上调软限制到硬限制
  • -H, hard limit, 硬限制,非 root 用户不能修改

如果没有指明,则同时修改软限制和硬限制。

修改 ulimit

修改分为临时修改和永久修改,临时修改只对当前 session 有效,登出和重启后都恢复系统设置。

临时修改使用 ulimit 命令,以修改 open file(s) 为例。

# ulimit -n 1024000
# ulimit -n
1024000

永久修改需要修改 /etc/security/limits.conf 或者在 /etc/security/limits.d/ 目录下添加一个文件。具体格式参考 /etc/security/limits.conf,里面有详细说明。

open file(s) 上限

回到遇到的问题中来:服务打开 80 万个左右的文件句柄就不能再打开了。所以, 尝试将 ulimit 设置为 1000 万,结果提示出错:

# ulimit -n 10000000
-bash: ulimit: open files: cannot modify limit: Operation not permitted

注意,使用的可以 root 用户,居然没有权限,然后尝试降低到:

  • 500 万,依然错误
  • 300 万,依然错误
  • 200 万,依然错误
  • 100 万,成功了

显然,这里有一个上限,大概在 100-200 万之间。

所以,解决问题的办法,在于怎样提高这个上限!

通过一番搜索,发现 open file(s) kernel 级别有 2 个配置,分别是:

fs.nr_open,进程级别
fs.file-max,系统级别

fs.nr_open 默认设置的上限是 1048576,所以用户的 open file(s) 不可能超过这个上限。

# sysctl -w fs.nr_open=10000000
# ulimit -n 10000000
# ulimit -n
10000000

修改后即可设置更大的 open file(s) 了。

同样,对于 kernel 参数的修改,sysctl 命令修改的是当前运行时,如果需要永久修改, 则将配置添加到 /etc/sysctl.conf 中,例如:

# echo "fs.nr_open = 10000000" >> /etc/sysctl.conf
# echo "fs.file-max = 11000000" >> /etc/sysctl.conf

注意:fs.nr_open 总是应该小于等于 fs.file-max

如果要查看当前打开的文件数,使用下面的命令:

# sysctl fs.file-nr
fs.file-nr = 1760       0       11000000

不过,增大这些值意味着能够打开更多的文件(在 Linux 中,everything is file,包括 socket),但是同时也意味着消耗更多的资源,所以基本上在物理机上才会遇到这种问题。

bookmark_borderCentos6.8下出现bash: scp: command not found lost connection问题解决

在内网,从一台服务器传mysql的源码安装包到另外一台服务器时,发生如下的错误:

$ scp mysql-5.1.55.tar.gz root@192.168.3.22:.
root@192.168.3.22's password: 
bash: scp: command not found
lost connection

提示scp的命令找不到,但是查找发现命令是存在的

$ whereis scp
scp: /usr/bin/scp /usr/share/man/man1/scp.1.gz

如果本地都没有问题,那是另一端服务器上没有安装scp的命令?

$ whereis scp
scp:

果真是如此,所以是server端没有找到scp的命令,而不是本地
安装上scp的依赖包

$ yum install openssh-clients

安装好之后,重新传输文件OK。

bookmark_borderCentos 测试硬盘读写速度

time有计时作用,dd用于复制,从if读出,写到of。if=/dev/zero不产生IO,因此可以用来测试纯写速度。同理of=/dev/null不产生IO,可以用来测试纯读速度。bs是每次读或写的大小,即一个块的大小,count是读写块的数量。

1.测/目录所在磁盘的纯写速度:

dd if=/dev/zero of=1Gb.file bs=1k count=1000000</code>

time sh -c "dd if=/dev/zero of=1Gb.file bs=1k count=1000000; sync"

2.测/目录所在磁盘的纯读速度:

dd if=1Gb.file bs=64k |dd of=/dev/null</code>

time sh -c "dd if=1Gb.file bs=64k |dd of=/dev/null; sync"

3.测读写速度:

dd if=1Gb.file of=2Gb.file bs=64k</code>

time sh -c "dd if=1Gb.file of=2Gb.file bs=64k; sync"

bookmark_border黑客声称Windows 7比Linux安全

Charlie Miller是黑客大赛Pwn2Own连续两年的冠军,最近他在接受访问的时候爆出,微软的Windows 7操作系统比苹果的MacOS更难攻破,当被问及Linux是否更加安全的时候,Charlie说攻击Linux操作系统实际上更加容易,之所以针对Linux的攻击较少,主要是因为其普及 Continue reading “黑客声称Windows 7比Linux安全”

bookmark_borderLinux 常用命令

Linux 系统常用命令格式:
command [option] [argument1] [argument2] …

其中option以“-”开始,多个option可用一个“-”连起来,如“ls -l -a” 与“ls -la”的效果是一样的。根据命令的不同,参数分为可选

的或必须的;所有的命令从标准输入接受输入,输出结果显示在标准输出,而错误信息则显示在标准错误输出设备。可使用重定向功能对这些

设备进行重定向。

命令在正常执行结果后返回一个0值,如果命令出错可未完全完成,则返回一个非零值(在shell中可用变量$?查看)。 在shell script中可用此

返回值作为控制逻辑的一部分。 Continue reading “Linux 常用命令”