Too many open files

环境:

192.168.128.111(ha1.haproxy.org) -> CentOS 6.3 64bit    siege 2.78
192.168.128.10(n1.web.org) -> CentOS 6.5 64bit     nginx 1.6.2

在192.168.128.111上使用siege对192.168.128.10的nginx做压力测试

[root@ha1 bin]# siege -c 6500 -r 1 "

Transactions:                   5827 hits
Availability:                  89.65 %
Elapsed time:                  25.58 secs
Data transferred:               3.40 MB
Response time:                  0.77 secs
Transaction rate:             227.80 trans/sec
Throughput:                     0.13 MB/sec
Concurrency:                  175.30
Successful transactions:        5827
Failed transactions:             673
Longest transaction:            6.10
Shortest transaction:           0.00

可以看到有673个失败,其中报了很多的错误,如下:

[error] descriptor table full sock.c:109: Too many open files

到n1.web.org服务器上

[root@n1 ~]# ulimit -n
1024
修改此值
[root@n1 ~]# ulimit -SHn 65535
[root@n1 ~]# ulimit -n
65535
[root@n1 ~]#

再回到ha1.haproxy.org服务器上进行测试,测试了两次结果如下:

Transactions:                   6500 hits
Availability:                 100.00 %
Elapsed time:                  11.34 secs
Data transferred:               3.79 MB
Response time:                  0.46 secs
Transaction rate:             573.19 trans/sec
Throughput:                     0.33 MB/sec
Concurrency:                  264.64
Successful transactions:        6500
Failed transactions:               0
Longest transaction:            4.66
Shortest transaction:           0.00
Transactions:                   6457 hits
Availability:                  99.34 %
Elapsed time:                  15.31 secs
Data transferred:               3.77 MB
Response time:                  0.75 secs
Transaction rate:             421.75 trans/sec
Throughput:                     0.25 MB/sec
Concurrency:                  316.52
Successful transactions:        6457
Failed transactions:              43
Longest transaction:            6.56
Shortest transaction:           0.00


以下说明转载【每天一小步

Too many open files 常见于高并发访问文件系统,多线程网络连接等场景。

程序经常访问的 文件、socketLinux中都是文件。系统需要记录每个当前访问的filenamelocationaccess authority等相关信息,这样的一个实体被称为file entry。“open files table”(图中橙色标识)存储这些file entry,以数组的形式线性管理。文件描述符(file descriptor)作为进程到open files table的指针,也就是open files table的下标索引,将每个进程与它所访问的文件关联起来。

wKiom1RvBFigSNOJAAD5eYCidaA220.jpg

每个进程中都一个file descriptor table管理当前进程所访问(open or create)的所有文件,文件描述符关联着open files table 中的file entry。对于open files table能容纳多少file entryLinux系统配置open files table的文件限制,如果超过配置值,就会拒绝其它文件操作的请求,并抛出Too many open files异常。

这种限制有系统级和用户级之分。

系统级:

系统级设置对所有用户有效。可通过两种方式查看系统最大文件限制

  1. cat     /proc/sys/fs/file-max

  2. sysctl -a 查看结果中fs.file-max这项的配置数量

如果需要增加配置数量就修改/etc/sysctl.conf文件,配置fs.file-max属性,如果属性不存在就添加。

配置完成后需要使用sysctl -p通知系统启用此项配置

用户级:

Linux限制每个登录用户的可连接文件数。可通过ulimit -n查看当前有效设置。如果想修改这个值就使用ulimit -SHn <number>命令。

 对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。 



你可能感兴趣的:(linux,文件描述符)