GO版本:go version go1.4.2 linux/amd64
执行协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。
Apache。
持续几秒的短期连接,比如快速事务,如果每秒处理1000个事务,只有约1000个并发连接到服务器。
事务延长到10秒,要维持每秒1000个事务,必须打开1万个并发连接。这种情况下:尽管你不顾DoS攻击,Apache也会性能陡降;同时大量的下载操作也会使Apache崩溃。
如果每秒处理的连接从5千增加到1万,你会怎么做?比方说,你升级硬件并且提高处理器速度到原来的2倍。发生了什么?你得到两倍的性能,但你没有得到两倍的处理规模。每秒处理的连接可能只达到了6000。你继续提高速度,情况也没有改善。甚至16倍的性能时,仍然不能处理1万个并发连接。所以说性能和可扩展性是不一样的。
问题在于Apache会创建一个CGI进程,然后关闭
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhostmpro]
#more/proc/cpuinfo|grep"modelname"
modelname:Intel(R)Core(TM)i5-4590cpu@3.30GHz
modelname:Intel(R)Core(TM)i5-4590cpu@3.30GHz
modelname:Intel(R)Core(TM)i5-4590cpu@3.30GHz
modelname:Intel(R)Core(TM)i5-4590cpu@3.30GHz
[root@localhostmpro]
#
[root@localhostmpro]
#grepMemTotal/proc/meminfo
MemTotal:3868776kB
[root@localhostmpro]
#getconfLONG_BIT
64
[root@localhostmpro]
#more/etc/redhat-release
CentOSLinuxrelease7.1.1503(Core)
|
测试用例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
packagemain
import(
"time"
)
funcmain(){
for
i:=0;i<200000;i++{
gofunc(){
time
.Sleep(5*
time
.Second)
}()
}
time
.Sleep(10*
time
.Second)
}
|
执行程序前:
1
2
3
4
5
|
top
-18:53:19up19min,3
users
,loadaverage:0.00,0.04,0.11
Tasks:522total,1running,521sleeping,0stopped,0zombie
KiBMem:3868776total,3327732
free
,235764used,305280buff
/cache
KiBSwap:2097148total,2097148
free
,0used.3397344availMem
|
执行程序后:
1
2
3
4
5
|
top
-18:53:37up19min,0.11
Tasks:524total,523sleeping,0zombie
KiBSwap:2097148total,0used.2880016availMem
|
总结:20万个协程占用了500M内存 50万KB
平均一个协程占用2.5KB