html5运用四种结构别离完成1百万websocket常衔接的效劳器-Html5-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:210回复:0

  html5运用四种结构别离完成1百万websocket常衔接的效劳器

楼主#
更多 发布于:2016-06-03 23:16

疑问提出的时分, 恰是 2001

年。这篇文章能够说是高功能效劳器开发的一个标志性文档,它评论的即是单机为1万个衔接供给效劳这个疑问,当时因为硬件和软件的约束,单机1万仍是

一个十分值得应战的方针。可是时光荏苒,随着硬件和软件的飞速发展,单机1万的方针现已成为了最简略不过的工作。如今用任何一种干流言语都能供给单机

1万的并发处理的才能。所以如今方针早已提高了100倍,成为C1000k,也即是一台效劳器为100万衔接供给效劳。在2010年,2011年现已看到一些完成C1000K的文章了,所以在2015年,完成C1000K应当不是一件艰难的工作。

这篇文章是我在实习过程中的记录,我的方针是运用spran-websocket,netty,

undertow和node.js四种结构别离完成C1000K的效劳器,看看这几个结构完成的难以程度,功能怎么。开发言语为Scala和javascript。

当然,谈起功能,咱们还必须谈到每秒每个衔接有多少个恳求,也即是RPS数,还要思考每条音讯的巨细。

通常来说,咱们会选择一个百分比,比方每秒20%的衔接会收发音讯。我的需求是效劳器仅仅

push

,客户端不会自动发送音讯。 通常每一分钟会为这一百万群发一条音讯。

所以完成的测验工具每个client树立60000个websocket衔接,总共二十个client。实践不也许运用20台机器,我运用了两台AWS

C3.2xlarge(8核16G)效劳器作为客户端机。每台机器10个客户端。

效劳器每1分钟群发一条音讯。音讯内容很简略,仅仅效劳器的当天时刻。

四个效劳器的代码和Client测验工具代码能够在 github

上下载。

测验下来能够看到每种效劳器都能轻松到达同时120万的websocket活动衔接,仅仅资本占用和事务处理时刻有不同。120万仅仅保存数据,在这么多衔接情况下效劳器仍然很轻松,下一步我会进行C2000K的测验。

在测验之前咱们需求对效劳器/客户机的一些参数进行调优。

效劳器的参数调优

通常会修正两个文件, /etc/sysctl.conf

和 /etc/security/limits.conf

, 用来装备TCP/IP参数和最大文件描述符。

TCP/IP参数装备

修正文件 /etc/sysctl.conf

,装备网络参数。

net.ipv4. tcp_wmem =

4096

87380

4161536

net.ipv4. tcp_rmem =

4096

87380

4161536

net.ipv4. tcp_mem =

786432

2097152

3145728

数值依据需求进行调整。更多的参数能够看曾经收拾的一篇文章: linux TCP/IP

协议栈调优

履行 /sbin/sysctl -p

即时收效。

最大文件描述符

Linux内核自身有文件描述符最大值的约束,你能够依据需求更改:

体系最大翻开文件描述符数:/proc/sys/fs/file-max

临时性设置: echo 1000000 > /proc/sys/fs/file-max

持久设置:修正 /etc/sysctl.conf

文件,添加 fs.file-max = 1000000

进程最大翻开文件描述符数

运用 ulimit -n

检查当时设置。运用 ulimit -n 1000000

进行临时性设置。

要想持久收效,你能够修正 /etc/security/limits.conf

文件,添加下面的行:

*

hard nofile 1000000

*

soft nofile 1000000

root hard nofile 1000000

root soft nofile 1000000

还有一点要注意的即是hard limit不能大于 /proc/sys/fs/nr_open

,因此有时你也需求修正nr_open的值。

履行 echo 2000000 > /proc/sys/fs/nr_open

检查当时体系运用的翻开文件描述符数,能够运用下面的指令:

[[email protected] ~]# cat /proc/

sys /fs/

file

-nr

1632

0

1513506

其间榜首个数表明当时体系已分配运用的翻开文件描述符数,第二个数为分配后已开释的(现在已不再运用),第三个数等于file-max。

总结一下:

一切进程翻开的文件描述符数不能超过/proc/sys/fs/file-max

单个进程翻开的文件描述符数不能超过user limit中nofile的soft limit

nofile的soft limit不能超过其hard limit

nofile的hard limit不能超过/proc/sys/fs/nr_open

运用运转时调优

Java 运用内存调优

效劳器运用12G内存,吞吐率优先的废物回收器:

JAVA_OPTS

= "-Xms12G -Xmx12G -Xss1M -XX:+UseParallelGC"

V8引擎

node --nouse-idle-notification --expose-gc --

max

-new-space- size

= 1024

-- max

-new-space- size

= 2048

-- max

-old-space- size

= 8192

./webserver.js

OutOfMemory Killer

假如效劳器自身内存不大,比方8G,在不到100万衔接的情况下,你的效劳器进程有也许呈现"Killed"的疑问。

运转 dmesg

能够看到

Out

of

memory: Kill process

10375

(java) score 59

or

sacrifice child

这是Linux的OOM Killer自动杀死的。

敞开oom-killer的话,在/proc/pid下对每个进程都会多出3个与oom打分调理有关的文件。临时对某个进程能够忽略oom-killer能够运用下面的方法:

echo -17 > /proc/$(pidof java)/oom_adj

解决办法有多种,能够参看文章最终的参阅文章,最佳是换一个内存更大的机器。

客户端的参数调优

在一台体系上,衔接到一个长途效劳时的本地端口是有限的。依据TCP/IP协议,因为端口是16位整数,也就只能是0到

65535,而0到1023是预留端口,所以能分配的端口仅仅1024到65534,也即是64511个。也即是说,一台机器一个IP只能创立六万多个长衔接。

要想到达更多的客户端衔接,能够用更多的机器或许网卡,也能够运用虚拟IP来完成,比方下面的指令添加了19个IP地址,其间一个给效劳器用,其它18个给client,这么

能够产生18 * 60000 = 1080000个衔接。

ifconfig

eth0: 0

192.168.77.10

netmask 255.255.255.0

up

ifconfig eth0: 1

192.168.77.11

netmask 255.255.255.0

up

ifconfig eth0: 2

192.168.77.12

netmask 255.255.255.0

up

ifconfig eth0: 3

192.168.77.13

netmask 255.255.255.0

up

ifconfig eth0: 4

192.168.77.14

netmask 255.255.255.0

up

ifconfig eth0: 5

192.168.77.15

netmask 255.255.255.0

up

ifconfig eth0: 6

192.168.77.16

netmask 255.255.255.0

up

ifconfig eth0: 7

192.168.77.17

netmask 255.255.255.0

up

ifconfig eth0: 8

192.168.77.18

netmask 255.255.255.0

up

ifconfig eth0: 9

192.168.77.19

netmask 255.255.255.0

up

ifconfig eth0: 10

192.168.77.20

netmask 255.255.255.0

up

ifconfig eth0: 11

192.168.77.21

netmask 255.255.255.0

up

ifconfig eth0: 12

192.168.77.22

netmask 255.255.255.0

up

ifconfig eth0: 13

192.168.77.23

netmask 255.255.255.0

up

ifconfig eth0: 14

192.168.77.24

netmask 255.255.255.0

up

ifconfig eth0: 15

192.168.77.25

netmask 255.255.255.0

up

ifconfig eth0: 16

192.168.77.26

netmask 255.255.255.0

up

ifconfig eth0: 17

192.168.77.27

netmask 255.255.255.0

up

ifconfig eth0: 18

192.168.77.28

netmask 255.255.255.0

up

修正 /etc/sysctl.conf

文件:

net.ipv4.ip_local_port_range

= 1024 65535

履行 /sbin/sysctl -p

即时收效。

效劳器测验

实践测验中我运用一台AWS C3.4xlarge (16 cores, 32G

memory)作为运用效劳器,两台AWS C3.2xlarge (8 cores, 16G

memory)效劳器作为客户端。这两台机器作为测验客户端捉襟见肘,每台客户端机器创立了十个内网虚拟IP,

每个IP创立60000个websocket衔接。

客户端装备如下:

/etc/sysctl.conf

装备

fs. file-max =

2000000

fs. nr_open =

2000000

net.ipv4. ip_local_port_range =

1024

65535

/etc/security/limits.conf

装备

*

soft nofile 2000000

*

hard nofile 2000000

*

soft nproc 2000000

*

hard nproc 2000000

效劳端装备如下:

/etc/sysctl.conf

装备

fs. file-max =

2000000

fs. nr_open =

2000000

net.ipv4. ip_local_port_range =

1024

65535

/etc/security/limits.conf

装备

*

soft nofile 2000000

*

hard nofile 2000000

*

soft nproc 2000000

*

hard nproc 2000000

Netty效劳器

树立120万个衔接,不发送音讯,轻轻松松到达。内存还剩14G未用。

[roocolobu ~] # ss -s; free -m

Total:

1200231

(kernel 1200245

)

TCP:

1200006

(estab 1200002

, closed 0

, orphaned 0

, synrecv 0

, timewait 0

/ 0

), ports 4

Transport Total IP IPv6

* 1200245

- -

RAW 0

0

0

UDP 1

1

0

TCP 1200006

1200006

0

INET 1200007

1200007

0

FRAG 0

0

0

total used free shared buffers cached

Mem:

30074

15432

14641

0

9

254

-/+ buffers/cache: 15167

14906

Swap:

815

0

815

每分钟给一切的120万个websocket发送一条音讯,音讯内容为当时的效劳器的时刻。这儿发送显现是单线程发送,效劳器发送完120万个总用时15秒摆布。

02 :15

:43

.307

[pool-1-thread-1]

INFO

com

.colobu

.webtest

.netty

.WebServer

$ -

send

msg

to

channels

for

c4453a26-bca6-42b6-b29b-43653767f9fc

02 :15

:57

.190

[pool-1-thread-1]

INFO

com

.colobu

.webtest

.netty

.WebServer

$ -

sent

1200000 channels

for

c4453a26-bca6-42b6-b29b-43653767f9fc

发送时CPU运用率并不高,网络带宽占用根本在10M摆布。

----total-cpu-usage---- -dsk/total- -net/total-

---paging-- ---system--

usr sys idl wai hiq siq | read writ| recv send| in

out | int csw

0

0

100

0

0

0

| 0 0 | 60B 540B| 0 0 | 224 440

0

0

100

0

0

0

| 0 0 | 60B 870B| 0 0 | 192 382

0

0

100

0

0

0

| 0 0 | 59k 74k| 0 0 |2306 2166

2

7

87

0

0

4

| 0 0 |4998k 6134k| 0 0 | 169k 140k

1

7

87

0

0

5

| 0 0 |4996k 6132k| 0 0 | 174k 140k

1

7

87

0

0

5

| 0 0 |4972k 6102k| 0 0 | 176k 140k

1

7

87

0

0

5

| 0 0 |5095k 6253k| 0 0 | 178k 142k

2

7

87

0

0

5

| 0 0 |5238k 6428k| 0 0 | 179k 144k

1

7

87

0

0

5

| 0 24k|4611k 5660k| 0 0 | 166k 129k

1

7

87

0

0

5

| 0 0 |5083k 6238k| 0 0 | 175k 142k

1

7

87

0

0

5

| 0 0 |5277k 6477k| 0 0 | 179k 146k

1

7

87

0

0

5

| 0 0 |5297k 6500k| 0 0 | 179k 146k

1

7

87

0

0

5

| 0 0 |5383k 6607k| 0 0 | 180k 148k

1

7

87

0

0

5

| 0 0 |5504k 6756k| 0 0 | 184k 152k

1

7

87

0

0

5

| 0 48k|5584k 6854k| 0 0 | 183k 152k

1

7

87

0

0

5

| 0 0 |5585k 6855k| 0 0 | 183k 153k

1

7

87

0

0

5

| 0 0 |5589k 6859k| 0 0 | 184k 153k

1

5

91

0

0

3

| 0 0 |4073k 4999k| 0 0 | 135k 110k

0

0

100

0

0

0

| 0 32k| 60B 390B| 0 0 |4822 424

客户端(总共20个,这儿选择其间一个检查它的目标)。每个客户端坚持6万个衔接。每个音讯从效劳器发送到客户端接收到总用时均匀633毫秒,并且标准差很小,每个衔接用时差不多。

Active WebSockets for

eb810c24- 8565

- 43

ea

-bc27- 9

a0b2c910ca4

count

= 60000

WebSocket Errors for

eb810c24- 8565

- 43

ea

-bc27- 9

a0b2c910ca4

count

= 0

-- Histograms

------------------------------------------------------------------

Message latency for

eb810c24- 8565

- 43

ea

-bc27- 9

a0b2c910ca4

count

= 693831

min

= 627

max

= 735

mean = 633.06

stddev = 9.61

median = 631.00

75

% <= 633.00

95

% <= 640.00

98

% <= 651.00

99

% <= 670.00

99.9

% <= 735.00

-- Meters

----------------------------------------------------------------------

Message Rate for

eb810c24- 8565

- 43

ea

-bc27- 9

a0b2c910ca4

count

= 693832

mean rate = 32991.37

events/minute

1

-minute rate = 60309.26

events/minute

5

-minute rate = 53523.45

events/minute

15

-minute rate = 31926.26

events/minute

Spray效劳器

树立120万个衔接,不发送音讯,轻轻松松到达。它的内存相对较高,内存还剩7G。

[[email protected] ~] # ss -s; free -m

Total:

1200234

(kernel 1200251

)

TCP:

1200006

(estab 1200002

, closed 0

, orphaned 0

, synrecv 0

, timewait 0

/ 0

), ports 4

Transport Total IP IPv6

* 1200251

- -

RAW 0

0

0

UDP 1

1

0

TCP 1200006

1200006

0

INET 1200007

1200007

0

FRAG 0

0

0

total used free shared buffers cached

Mem:

30074

22371

7703

0

10

259

-/+ buffers/cache: 22100

7973

Swap:

815

0

815

每分钟给一切的120万个websocket发送一条音讯,音讯内容为当时的效劳器的时刻。

CPU运用较高,发送很快,带宽能够到达46M。群发完一次大概需求8秒摆布。

05

/ 22

04

: 42

: 57.569

INFO

[ool- 2

-worker- 15

] c

. c

.w.s. WebServer

- send msg to workers 。 for

8454e7d8-b8ca- 4881

-912b-6cdf3e6787bf

05

/ 22

04

: 43

: 05.279

INFO

[ool- 2

-worker- 15

] c

. c

.w.s. WebServer

- sent msg to workers for

8454e7d8-b8ca- 4881

-912b-6cdf3e6787bf. current workers: 1200000

----total-cpu-usage---- -dsk/total- -net/total-

---paging-- ---system--

usr sys idl wai hiq siq | read writ| recv send| in

out | int csw

74

9

14

0

0

3

| 0 24k|6330k 20M| 0 0 | 20k 1696

70

23

0

0

0

6

| 0 64k| 11M 58M| 0 0 | 18k 2526

75

11

6

0

0

7

| 0 0 |9362k 66M| 0 0 | 24k 11k

82

4

8

0

0

6

| 0 0 | 11M 35M| 0 0 | 24k 10k

85

0

14

0

0

1

| 0 0 |8334k 12M| 0 0 | 44k 415

84

0

15

0

0

1

| 0 0 |9109k 16M| 0 0 | 36k 425

81

0

19

0

0

0

| 0 24k| 919k 858k| 0 0 | 23k 629

76

0

23

0

0

0

| 0 0 | 151k 185k| 0 0 | 18k 1075

客户端(总共20个,这儿选择其间一个检查它的目标)。每个客户端坚持6万个衔接。每个音讯从效劳器发送到客户端接收到总用时均匀1412毫秒,并且标准差较大,每个衔接用时不同较大。

Active WebSockets for 6674

c9d8- 24

c6- 4

e77- 9

fc0- 58

afabe7436f

count =

60000

WebSocket Errors for 6674

c9d8- 24

c6- 4

e77- 9

fc0- 58

afabe7436f

count =

0

-- Histograms

------------------------------------------------------------------

Message latency for 6674

c9d8- 24

c6- 4

e77- 9

fc0- 58

afabe7436f

count =

454157

min =

716

max =

9297

mean =

1412.77

stddev =

1102.64

median =

991.00

75

% <= 1449.00

95

% <= 4136.00

98

% <= 4951.00

99

% <= 5308.00

99.9

% <= 8854.00

-- Meters

----------------------------------------------------------------------

Message Rate for 6674

c9d8- 24

c6- 4

e77- 9

fc0- 58

afabe7436f

count =

454244

mean rate =

18821.51

events/minute

1

-minute rate =

67705.18

events/minute

5

-minute rate =

49917.79

events/minute

15

-minute rate =

24355.57

events/minute

Undertow

树立120万个衔接,不发送音讯,轻轻松松到达。内存占用较少,还剩下11G内存。

[[email protected] ~] # ss -s; free -m

Total:

1200234

(kernel 1200240

)

TCP:

1200006

(estab 1200002

, closed 0

, orphaned 0

, synrecv 0

, timewait 0

/ 0

), ports 4

Transport Total IP IPv6

* 1200240

- -

RAW 0

0

0

UDP 1

1

0

TCP 1200006

1200006

0

INET 1200007

1200007

0

FRAG 0

0

0

total used free shared buffers cached

Mem:

30074

18497

11576

0

10

286

-/+ buffers/cache: 18200

11873

Swap:

815

0

815

每分钟给一切的120万个websocket发送一条音讯,音讯内容为当时的效劳器的时刻。

群发玩一次大概需求15秒。

03 :19

:31

.154

[pool-1-thread-1]

INFO

c

.colobu

.webtest

.undertow

.WebServer

$ -

send

msg

to

channels

for

d9b450da-2631-42bc-a802-44285f63a62d

03 :19

:46

.755

[pool-1-thread-1]

INFO

c

.colobu

.webtest

.undertow

.WebServer

$ -

sent

1200000 channels

for

d9b450da-2631-42bc-a802-44285f63a62d

客户端(总共20个,这儿选择其间一个检查它的目标)。每个客户端坚持6万个衔接。每个音讯从效劳器发送到客户端接收到总用时均匀672毫秒,并且标准差较小,每个衔接用时不同不大。

Active WebSockets for

b2e95e8d-b17a- 4

cfa- 94

d5-e70832034d4d

count = 60000

WebSocket Errors for

b2e95e8d-b17a- 4

cfa- 94

d5-e70832034d4d

count = 0

-- Histograms

------------------------------------------------------------------

Message latency for

b2e95e8d-b17a- 4

cfa- 94

d5-e70832034d4d

count = 460800

min = 667

max = 781

mean = 672.12

stddev = 5.90

median = 671.00

75

% <= 672.00

95

% <= 678.00

98

% <= 684.00

99

% <= 690.00

99.9

% <= 776.00

-- Meters

----------------------------------------------------------------------

Message Rate for

b2e95e8d-b17a- 4

cfa- 94

d5-e70832034d4d

count = 460813

mean rate = 27065.85

events

/minute

1

-minute rate = 69271.67

events

/minute

5

-minute rate = 48641.78

events

/minute

15

-minute rate = 24128.67

events

/minute

Setup Rate for

b2e95e8d-b17a- 4

cfa- 94

d5-e70832034d4d

node.js

node.js不是我要思考的结构,列在这儿仅仅作为参阅。功能也不错。

Active WebSockets for 537

c7f0d-e58b- 4996

-b29e- 098

fe2682dcf

count =

60000

WebSocket Errors for 537

c7f0d-e58b- 4996

-b29e- 098

fe2682dcf

count =

0

-- Histograms

------------------------------------------------------------------

Message latency for 537

c7f0d-e58b- 4996

-b29e- 098

fe2682dcf

count =

180000

min =

808

max =

847

mean =

812.10

stddev =

1.95

median =

812.00

75

% <= 812.00

95

% <= 813.00

98

% <= 814.00

99

% <= 815.00

99.9

% <= 847.00

-- Meters

----------------------------------------------------------------------

Message Rate for 537

c7f0d-e58b- 4996

-b29e- 098

fe2682dcf

count =

180000

mean rate =

7191.98

events/minute

1

-minute rate =

10372.33

events/minute

5

-minute rate =

16425.78

events/minute

15

-minute rate =

9080.53

events/minute

参阅文档

主题:

效劳器、WebSocket、Linux、CPU、Java、Scala、Linux内核、求是、数据、需求、

优质IT资源分享社区为你提供此文。

本站有大量优质html5 css js等web前端开发教程视频,资料等资源,包含html5 css js 前端开发框架等基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

WEB前端开发教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客