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@localhost mpro]
# more /proc/cpuinfo | grep "model name"
model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
[root@localhost mpro]
#
[root@localhost mpro]
# grep MemTotal /proc/meminfo
MemTotal: 3868776 kB
[root@localhost mpro]
# getconf LONG_BIT
64
[root@localhost mpro]
# more /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
|
测试用例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package main
import (
"time"
)
func main() {
for
i := 0; i < 200000; i++ {
go func() {
time
.Sleep(5 *
time
.Second)
}()
}
time
.Sleep(10 *
time
.Second)
}
|
执行程序前:
1
2
3
4
5
|
top
- 18:53:19 up 19 min, 3
users
, load average: 0.00, 0.04, 0.11
Tasks: 522 total, 1 running, 521 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.6
id
, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 3868776 total, 3327732
free
, 235764 used, 305280 buff
/cache
KiB Swap: 2097148 total, 2097148
free
, 0 used. 3397344 avail Mem
|
执行程序后:
1
2
3
4
5
|
top
- 18:53:37 up 19 min, 3
users
, load average: 0.00, 0.04, 0.11
Tasks: 524 total, 1 running, 523 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 10.6 sy, 0.0 ni, 88.2
id
, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 3868776 total, 2793732
free
, 752512 used, 322532 buff
/cache
KiB Swap: 2097148 total, 2097148
free
, 0 used. 2880016 avail Mem
|
总结:20万个协程占用了500M内存 50万KB
平均一个协程占用2.5KB