golang协程资源占有率

前端之家收集整理的这篇文章主要介绍了golang协程资源占有率前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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
%cpu(s):0.1us,0.2sy,0.0ni,99.6 id ,0.0wa,0.0hi,0.1si,0.0st
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
%cpu(s):1.2us,10.6sy,88.2 id ,2793732 free ,752512used,322532buff /cache
KiBSwap:2097148total,0used.2880016availMem

总结:20万个协程占用了500M内存 50万KB

平均一个协程占用2.5KB

原文链接:https://www.f2er.com/go/189813.html

猜你在找的Go相关文章