Linux 下 socket 高并发分析与优化

工作环境

操作系统:Linux ( Ubuntu server 12.04 / 64 bit)
内核版:Linux Ubuntu-Server 3.13.0-32-generic


1:连接限制

- 文件句柄限制
在 linux 下网络编程每一个 tcp 连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can’t open so many files”。
这时需要明白操作系统对可以打开的最大文件数的限制。

  • 进程限制
    查看系统允许当前用户进程打开的文件数限制
ulimit -n
//默认输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以如果采用此默认配置单进程最多可以并发上千个 TCP 连接。
1. 修改/etc/security/limits.conf文件,在文件中添加如下行:
* soft nofile 204800
* hard nofile 204800
// * 代表所有用户
2. 修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/x86_64-linux-gnu/security/pam_limits.so
// 这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量
// 的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf
// 文件中读取配置来设置这些限制值。修改完后保存此文件。
  • 全局限制

查看Linux系统级的最大打开文件数限制,使用如下命令:

cat /proc/sys/fs/file-max
//显示的是这台Linux系统最多允许同时打开(即包含所有用户打开)文件数总和,是Linux系统级硬限制,
//所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源
//状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件
//数限制设置超过此限制的值。
cat /proc/sys/fs/file-nr 
// 输出 9344 0 592026,分别为:1.已经分配的文件句柄数,2.已经分配但没有使用的文件句柄数,3.最大文件句柄数。但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经被使用了 。

用 root 权限修改 /etc/sysctl.conf 文件,把这个数值改大些:

net.nf_conntrack_max = 204800
net.netfilter.nf_conntrack_max = 204800
/sbin/sysctl -p //立即生效
/sbin/sysctl net.netfilter
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值