专栏首页solate 杂货铺单服100w长连接报告笔记

单服100w长连接报告笔记

单服100w长连接报告笔记

建议直接看参考的原版报告,这篇为我大致记录的一些配置,部分还为理解,后续进行修改补充。

C1000K

从 C1000K 说起 ,C1000K 是什么意思?为了搞清楚这个问题,必须先提 起”The C10K problem” (http://www.kegel.com/c10k.html), 顾名思义 10K 就是 1 万,这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是 单机为1万个连接提供服务这个问题,当时因为硬件和软件的限制,单机1万还是一个非常值得挑战的目标。 但是时光荏苒,随着硬件和软件的飞速发展,单机 1 万 的目标已经变成了最简单不过的事情。 现在用任何一种主流语言都能提供单机 1 万 的并发处理的能力。所以现在目标早已提高了100倍,变成 C1000k,也就是一台服务器为100万连接提供服务 。 国外公司 whatapps 的曾经分享过相关内容,他们在2011年9月宣称完成了单机100万用户支持(他们最后做到了 C2000k,而且是实打实的在线用户)。所以 C10M,C100M 才是今后继续努力的方向,

系统准备

硬件

服务器

首先查看服务器的信息

dmidecode | grep "Product Name"

CPU

然后检查 CPU 的规格

cat /proc/cpuinfo | grep name | awk -F: '{print $(NF)}' | uniq -c

内存

检查内存大小

cat /proc/meminfo

网卡

查看网卡, 网卡一般为 eth0 等。

dmesg | grep -i eth

软件

操作系统

lsb_release -a

内核版本

uname -a

系统优化

系统优化是非常关键的一步,因为默认的系统设置并不是以高并发高负载 的服务器做为目标的,所有配置需要进行修改,这样可以尽可能的使用操作系统和 硬件的能力。

  1. 根据高并发高负载的业务要求,对 Linux 的系统设置进行优化,如最大 文件数目,TCP/IP 的设置参数等等。这个层级的优化经验,基本适用于大多数的 服务器设置。
  2. 根据硬件的特性,对硬件的设置进行优化。这个级别的要求更高,也更 有正针对性。

Linux 系统设置

提高文件数目上限

在 Linux 中 socket 被表示为一个文件描述符,默认的文件数目上限是 1024,当然这是远远不够的。 你需要做的是自然是提高文件打开上限。

ulimit -a

可以看到现有的 open files 的数值为 1024. 这意味着这 台服务器只能同时为 1024 个用户提供服务。当然这是远远不够。

有 2 个方法,

  1. 修改linux
1. 修改 /etc/security/limits.conf

hard nofile 1025500
soft nofile 1025500


2. 修改/etc/sysctl.conf

fs.file-max=1025500


3. 运行 sysctl –p 使修改生效
4. 重新登录并确认修改生效
  1. TCP/IP 的优化

TCP/IP 的优化选项非常的多.

  • 修改 net.core.somaxconn 以及 net.core.tcp_max_syn_backlog

要解释这个问题,需要对网络服务的 Accpet 有深入的了解,这里我借 助陶辉老师关于高性能服务器系列博客里的一张图来解释这个选项。 [http://taohui.org.cn/tcpperf1.html]

如果有高并发的请求来进行连接,而我们的队 列过小,客户端就直接连接失败。如果我们把队列扩大,那么我们的服务器 就有机会把暂时处理不了的请求,暂存起来,慢慢处理。

使用 ss –n –l 命令,检查 Send-Q 那一列,你就知道是否已经生效了。

  • 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 包无法发送给对方。(如果希望重现这个攻击的过程,你可以写一个简单的客户端,连接上一台 Nginx 获取一个比较大的文件。 在发送完请求以后,并不 读取数据, 那么服务端的这个连接,将在 tcp_keepalive_time 时间内无法 被关闭。)修改这 3 个参数可以减少被攻击的几率。

  1. tcp_keepalive_time : 防止空连接攻击,可以缩小该值, 建议改为 180
  2. tcp_keepalive_intvl : 当探测没有确认时,重新发送探测的频度。缺省是 75 秒。建议改为 30 秒
  3. tcp_keepalive_probes 进行多少次探测,因为探测的间隔是按照指数级别增长,默认为 9 次。建议改为 5 次。
客户端相关
  • 提高cwnd

提高拥塞窗口大小。 拥塞窗口主要是为了解决网络拥塞的问题,但是 默认的拥塞窗口会导致网络传输数据的启动速度比较低。

按照 google 的推荐,我建议将其改为 10. 修改方法如下(火丁笔记 http://huoding.com/2013/11/21/299)

shell> ip route | while read p; do
            ip route change $p initcwnd 10
       done
  • ip_local_port_range

可用端口范围。很简单改到 1024 到 65535

硬件优化

确定网卡的 IRQ

cat /proc/interrupts

网卡 eth0 的 IRQ 为 49

从硬件信息可知我的 CPU 为 4 核,那么我们可以把主设备的中断处理分配到 4个核上。

echo 0-3 > /proc/irq/49/smp_affinity_list
cat smp_affinity_list
cat /proc/irq/49/smp_affinity

还需要启动 RPS 。(注意 RPS 对 linux 内核版本有要求,需要高于 2.6.32, 而我们的内核是 3.x,所以肯定会支持 这个特性)

如何确定我的网卡是一块单队列的网卡呢?

首先 lspci –vvv 找到网卡相应的信息,按照 [http://blog.chinaunix.net/uid-10915175-id-3367864.html] 的说法 “Ethernet controller 的条目内容, 如果有 MSI-X && Enable+ && TabSize > 1, 则该网卡是多队列网卡 ”,这条信息显示了是否是多队列,很不幸这是块单队列的网卡。

还有个办法 去/sys 里面再次确认一下

ls /sys/class/net/eth0/queues/


结果:
rx-0 tx-0

发现的确只有一个 RX 一个 TX。这说明这是一个单队列的网卡

目前系统的优化,就告一个段落。 sysctl.conf 文件的一些修改。

sysctl -p

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 工作日记

    (Perf -- Linux下的系统性能调优工具,第 1 部分)[http://www.ibm.com/developerworks/cn/linux/l-cn...

    solate
  • go test 使用总结

    solate
  • go []string slice utils

    solate
  • Windows下更改Mac地址

    在桌面上的“网上邻居”图标上单击右键,选择“属性”,在弹出的“网络连接”的对话框中,在“本地连接”图标上单击右键,选择“属性”,会弹出一个“本地连接属性”的对话...

    周俊辉
  • 国产光纤网卡:助力影视产业发展

    “党的十九大提出,中国特色社会主义进入新时代,我国社会主要矛盾已经转化为人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾。”

    深圳市联瑞电子
  • 如何用JavaScript进行数组去重

    今天的文章和大家谈一谈如何用JavaScript进行数组去重,这是一道常见的面试(笔试)题,可以很好地考察出一个人的逻辑思维及边界考虑情况,希望此文能够帮助大家...

    个推君
  • 计算机上的网卡工作情况

    一般电脑都有一个网络接口,简称“网口” 或 “ 端口 ” 逻辑讲,网卡包含7个功能模块,分别是 CU 控制单元、OB 输出缓存、IB 输入缓存、LC 线路编码器...

    萌海无涯
  • 【python正则】工作中常用的pyth

    # 4到16位(字母,数字,下划线,减号) if re.match(r'^[a-zA-Z0-9_-]{4,16}$', "abwc"):   print("匹...

    py3study
  • java8 parallel并行处理实战

    老梁
  • 实现类似“添加扩展程序…”的设计时支持

    Ajax Control Toolkit这个控件库内包含一些扩展控件,利用这些扩展控件,可以非常方便的为普通的控件添加Ajax效果,例如,利用AutoComp...

    明年我18

扫码关注云+社区

领取腾讯云代金券