应用开发提高性能内核可修改的参数

proc文件系统介绍

由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

网络编程常用设置参数

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

file-max指定了系统范围内所有进程可以打开的文件句柄的数量限制

2、cat /proc/sys/fs/file-nr

操作系统能否支持百万连接?

对于绝大部分 Linux 操作系统, 默认情况下确实不支持 C1000K! 因为操作系统包含最大打开文件数(Max Open Files)限制, 分为系统全局的, 和进程级的限制.

全局限制

在 Linux 下执行:

cat /proc/sys/fs/file-nr
会打印出类似下面的一行输出:
5100	0	101747

第三个数字 101747 就是当前系统的全局最大打开文件数(Max Open Files), 可以看到, 只有 10 万, 所以, 在这台服务器上无法支持 C1000K. 很多系统的这个数值更小, 为了修改这个数值, 用 root 权限修改 /etc/sysctl.conf 文件:

fs.file-max = 1020000
net.ipv4.ip_conntrack_max = 1020000
net.ipv4.netfilter.ip_conntrack_max = 1020000

进程限制

执行:

ulimit -n

输出:

1024

说明当前 Linux 系统的每一个进程只能最多打开 1024 个文件. 为了支持 C1000K, 你同样需要修改这个限制.

临时修改

ulimit -n 1020000

不过, 如果你不是 root, 可能不能修改超过 1024, 会报错:

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

永久修改

编辑 /etc/security/limits.conf 文件, 加入如下行:

# /etc/security/limits.conf
work         hard    nofile      1020000
work         soft    nofile      1020000

可以修改

/proc/sys/net/ipv4/tcp_wmem
/proc/sys/net/ipv4/tcp_rmem

来控制 TCP 连接的发送和接收缓冲的大小


TCP/IP的优化

TCP/IP的优化选项非常的多,而且Linux提供了非常友好的修改方法,使用起来非常方便。但是对于TCP/IP各个字段的意义,以及可能产生的后果,需要对TCP/IP本身有一个较为深入的理解。下面是我修改的一些字段,仅供参考。•
修改backlog的队列大小

net.core.somaxconn

net.core.tcp_max_syn_backlog

如果有高并发的请求来进行连接,而我们的队
列过小,客户端就直接连接失败。如果我们把队列扩大,那么我们的服务器
就有机会把暂时处理不了的请求,暂存起来,慢慢处理。当然要处理大规模
并发请求,还需要一些别的技巧。
如何确认修改已经生效了呢?
使用 ss –n –l 命令,检查 Send-Q 那一列,你就知道是否已经生效了。你可以看到默认值是 128 是不是非常的小。此外这个参数的修改 在 Nginx等高性能服务器的配置里也有类似的参数。所以是一个很必要的参数。(这个参数还和 listen 的参数相关,所以代码部分也要注意)

tcp_syncookies
开启 tcp_syncookie 可以防止 syn floor 攻击,同时在 syn_backlog 已满
的情况下,不会抛弃 syn 包。推荐打开
• tcp_max_tw_buckets
修改系统中处于 timewait 状态的连接的数目。关于 timewait 状态,
Steven 老师说过他是我们的朋友。但有时候我们需要关闭它。主要为了防>
止对系统资源的占有。我把它设置为 10000
• tcp_tw_recycle
用于快速回收处于 timewait 的连接。但是它和 timestamp 一起作用时
可能会导致同一个 NAT 过来的连接失败。关闭它。
• timestamps
为了避免它和 tcp_tw_recycle 一起导致问题, 我推荐关闭它。
• tcp_tw_reuse
允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,使用下来效果不是
很好。但是还是建议开启。
• tcp_fin_timeout
如果本方关闭连接,则它在 FIN_WAIT_2 状态的时间。建议改为 10。
• tcp_synack_retries
对于远端的连接请求 SYN,服务器对应的 ack 响应的数目。我把它设置为
10。
• tcp_keepalive_time tcp_keepalive_intvl tcp_keepalive_probes
这主要是为了解决 TCP 的 CLOSE_WAIT 问题,有人说它是 TCP 的癌症。
一般来说 TCP 处于 CLOSE_WAIT 的状态,说明你的连接处于半连接状态,你已
经无法收到对方的信息了,绝大多数的情况下,你需要离开关闭连接。如果
你的代码出现问题,忘记关闭了这个连接(TCP 是双工的),那么资源就一直被
泄漏着。还有一种情况则是,对方故意不收取你的数据,导致你最后的 fin 包
C1000K实践报告 - 11 -
无法发送给对方。(如果希望重现这个攻击的过程,你可以写一个简单的客
户端,连接上一台 Nginx 获取一个比较大的文件。在发送完请求以后,并不
读取数据, 那么服务端的这个连接,将在 tcp_keepalive_time 时间内无法
被关闭。)修改这 3 个参数可以减少被攻击的几率。
tcp_keepalive_time
防止空连接攻击,可以缩小该值, 建议改为 180
tcp_keepalive_intvl
当探测没有确认时,重新发送探测的频度。缺省是 75 秒。建议改为 30 秒
tcp_keepalive_probes
进行多少次探测,因为探测的间隔是按照指数级别增长,默认为 9 次。建议
改为 5 次。

测试网络带宽

dd if=/dev/zero bs=1MB count=10000 |nc localhost 5001

nc -l 5001

线程栈大小设置及线程最大数设置

ulimit -a 显示当前,修改时修改sysctl.conf(需要计算内存是否够用)


cat /proc/sys/net/ipv4/ip_local_port_range

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值