由买买提看人间百态

topics

全部话题 - 话题: algernon
首页 上页 1 2 3 4 5 6 7 下页 末页 (共7页)
h*i
发帖数: 3446
s********k
发帖数: 6180
2
有几个人能有做出Nginx水平啊,广大人民群众的需求这点少的牛人满足不了啊
s********k
发帖数: 6180
3
话说老兄觉得Golang现在没法pin to core,不识NUMA,这正是大好机会啊,你要是能
够参与这方面的工作岂不是立马就大包裹了.看问题角度要不同嘛,你看到一个东西烂
,但是还很受欢迎,不要去质疑为什么烂还收欢迎,要去想为啥这么烂还能收欢迎,我
稍微改进下岂不是可以日进斗金。这样想大包裹自然来。
随便给两个你看看
https://docs.google.com/document/u/0/d/1d3iI2QWURgDIsSR6G2275vMeQ_X7w-
qxM2Vp7iGwwuM/pub
https://docs.google.com/document/d/1At2Ls5_
fhJQ59kDK2DFVhFu3g5mATSXqqV5QrxinasI/edit

发帖数: 1
4
> : https://docs.google.com/document/d/1At2Ls5_
> : fhJQ59kDK2DFVhFu3g5mATSXqqV5QrxinasI/edit
竟然是Russ Cox,多年前经常在USACO上看到他的题解,往事如梦啊

发帖数: 1
5
罪魁祸首找到了:obj := *(*uintptr)(unsafe.Pointer(b + i))
// scanobject scans the object starting at b, adding pointers to gcw.
// b must point to the beginning of a heap object or an oblet.
// scanobject consults the GC bitmap for the pointer mask and the
// spans for the size of the object.
//
//go:nowritebarrier
func scanobject(b uintptr, gcw *gcWork) {
// Note that arena_used may change concurrently during
// scanobject and hence scanobject may encounter a pointer to
// a new... 阅读全帖

发帖数: 1
6
赞啊,转码浪费了,可是不转还是没钱,唉,人生好难
f*******t
发帖数: 7549
7
展开说说?

发帖数: 1
8
目前发现两大问题:
1. GOGC,关闭Garbage Collection,性能提高20%,无语了,golang不是吹牛GC比JVM
G1强很多么?NGINX不用GC不是照样可以写程序么?
2. 滥用FUTEX,从strace上看,一个HTTP GET引发众多threads拼抢,thundering herd
problem,跟NGINX的SO_REUSEPORT设计完全不同。GO runtime调度需要用futex,众多
goroutines给本来就很脆弱的futex加重负担。
各位大侠,我没学过golang,只花了几天测测http性能,就发现这两个问题,这应该是
设计失误吧?
[pid 29063] <... epoll_wait resumed> [{EPOLLIN|EPOLLOUT, {u32=4228357504,
u64=140170486062464}}], 128, -1) = 1
[pid 29063] futex(0x147c010, FUTEX_WAKE, 1) = 1
[pid 29063] read(6,
[pid 290... 阅读全帖

发帖数: 1
T********i
发帖数: 2416
10
pid 29010 貌似是GC thread。否则没法解释20us醒一次。
GC overhead如果20%的话,其实是很不错的。C的内存管理overhead其实也很高。一般
比20%要大。
当然我可以用空间换时间。但是那是customize allocators。
g****t
发帖数: 31659
11
牛。GC你统计过longest pause什么的吗?
gc作者之一在这里
https://groups.google.com/forum/m/?fromgroups#!topic/golang-dev/Ab1sFeoZg_8


: 罪魁祸首找到了:obj := *(*uintptr)(unsafe.Pointer(b i))

: // scanobject scans the object starting at b, adding pointers to
gcw.

: // b must point to the beginning of a heap object or an oblet.

: // scanobject consults the GC bitmap for the pointer mask and
the

: // spans for the size of the object.

: //

: //go:nowritebarrier

: func scanobject(b uintptr, gc... 阅读全帖
g****t
发帖数: 31659
12
可预测性很重要。jvm最早时候我记得老死机吧?
c的话比较复杂,各种编译器各种优化什么的。


: pid 29010 貌似是GC thread。否则没法解释20us醒一次。

: GC overhead如果20%的话,其实是很不错的。C的内存管理overhead其实
也很高
。一般

: 比20%要大。

: 当然我可以用空间换时间。但是那是customize allocators。

s********k
发帖数: 6180
13
赞干货
两个问题
1,关闭GC等于内存最后一直在那然后不会回收,你做一次test可能性能更好,但是肯
定不是长久之计,GC只有20%的overhead其实还不错了,拿完全手动内存分配的C和go的
GC比肯定好,就像极致的手动挡当然比自动挡快,可以比较下JVM有GC下的overhead?
2. FUTEX, 是不是这个问题?https://github.com/golang/go/issues/23360
话说完全可以提交一个PR了

JVM
herd
d***a
发帖数: 13752
14
如果用golang的syscall包,可以用SO_REUSEPORT吧。OS要支持SO_REUSEPORT。
这个比较对golang不太公平。golang可以做很多事情,nginx专长做web server。
s********k
发帖数: 6180
15
所以说就是golang的这个包并没有做event based loop,还是直接狂开goroutine,所
以肯定比不过专门针对epoll做的IO密集型nginx?
s********k
发帖数: 6180
16
golfing 里面那个http package最好?

发帖数: 1
17
SO_REUSEPORT是Linux Kernel 3.9里面新加的,可以让多个process共享socket,减少
socket accept上的瓶颈。
golang不支持这个我挺吃惊的。NGINX 1.9就有了。对于业务繁重的HTTP服务器,或者
压力测试,SO_REUSEPORT必不可少。
感觉默认的goroutine blocking工作模式效率比non-blocking event poll低很多,虽
然编程更容易。
难道后端不应该都是non-blocking模式么?还有goroutine概念,给硬件加速带来负担
。不知道各种网卡traffic steering技术对golang有没有效果。

发帖数: 1
18
内存设计得好,就不需要自动GC。内存泄露可以用工具各种测试,反而JVM GC的bug不
好弄,也不好优化。
Cassandra为了躲避GC,特地用JNI搞了offheap objects,malloc也换成jemalloc,这
不就是Cpp么?
JVM GC效率也是问题,G1比CMS慢好多,Shenandoah比G1更慢。。。
关于20%问题,对于软件工程师可能不算什么,对于硬件CPU,10%以上就可以决定跑分
输赢。

发帖数: 1
19
自动GC的问题就是为了增加可预测性,牺牲性能,参考G1GC。
我一直想不通,需要可预测性的程序为什么不直接上Cpp?毕竟FG和微软腾讯百度华为
都这么做了
只有亚麻和阿里是奇葩。
s********k
发帖数: 6180
20
这些大公司里面,CPP,java,golang都用的(当然软软加上C#),CPP是好,但是真是
顶级人才满足不了人民群众日益增长需求,要精通太难了。
做大规模项目
human is always the least scalable in your system
s********k
发帖数: 6180

发帖数: 1
22
謝謝,我也找到這些了,但他們都是非標準、野生的SO_REUSEPORT庫,我本身也不是搞
golang的,只能報告裡面寫,目前標準golang不支持,未來1.11有可能支持了
w**z
发帖数: 8232
23
绝大部分的应用对实时性的要求是可以容忍 偶尔 long gc。 一般互联网公司 SLA 99.
99% 在 large distributed system 里,别说 long paused GC, 整个机器不见了的事
情时刻在发生。客户端容错做好就行了,一个 request timeout, 下一个 request 就
去别的node

:自动GC的问题就是为了增加可预测性,牺牲性能,参考G1GC。
:我一直想不通,需要可预测性的程序为什么不直接上Cpp?毕竟FG和微软腾讯百度华为

发帖数: 1
24
其實不是這樣的,這個問題叫long tail latency problem,困擾我們很久了,因為越
大的雞群,層數多,服務複雜,這1%的tail latency將會被放大很多倍,這個blog有討
論:http://accelazh.github.io/storage/Tail-Latency-Study
百度GO-BFE應用也討論過這個問題,他們的結論居然跟我昨天上面寫得一樣:
1。關閉GOGC,優化tail latency。
2。目前沒有辦法解決大量goroutine的併發問題,只能拚機器,靠GO研發4倍于C非阻塞
事件編程的效率,來彌補goroutine性能問題。
結論是GO可以被使用,但需要優化。
https://youtu.be/n9FkJkMdzL4

99.
华为

发帖数: 1
25
牛逼,请收下我的膝盖
s********k
发帖数: 6180
26
赞资料
现在golang运行环境大部分其实更复杂,很多事在cloud上的VM做的,VM针对bare
linux的调度就是多了一层,如果用container(绝大部分golang都用k8s或者其他
container的部署技术)比如k8s,那么一个VM只是一个node,上面还有很多pod,又加
了一层隔离,其中的网络配置方式也可以有多种。所以这个性能优化还真是一个大课题
。搞定这个绝对大包不愁啊
magagop 你底层系统经验这么好,绝对应该搞搞这个
y*j
发帖数: 3139
27
关于Go的多线程GC慢的问题,这里有一个解释:
https://blog.cloudflare.com/go-dont-collect-my-garbage/
基本就是线程很多的时候,GC频繁回收大量的临时变量,导致性能提升不大。
他调节了GOGC的参数,最后能够充分利用24核,性能提高23倍。


: 自动GC的问题就是为了增加可预测性,牺牲性能,参考G1GC。

: 我一直想不通,需要可预测性的程序为什么不直接上Cpp?毕竟FG和微软
腾讯百
度华为

: 都这么做了

: 只有亚麻和阿里是奇葩。

y*j
发帖数: 3139
28
关于Golang, 我感觉是CPP的一个简化版,但是砍得太猛了,也许留下stack 上的自动
变量会好一些。至少减轻GC的压力。


: 自动GC的问题就是为了增加可预测性,牺牲性能,参考G1GC。

: 我一直想不通,需要可预测性的程序为什么不直接上Cpp?毕竟FG和微软腾讯百
度华为

: 都这么做了

: 只有亚麻和阿里是奇葩。


发帖数: 1
29
剛才看了看goroutine的評論,發現Csharp的fiber和Java的loom都很有競爭力,Cpp也
有Facebook的Folly庫支持fiber,看來狗家go確實沒有軟家Csharp語言能力強。
T********i
发帖数: 2416
30
俺一直都说,C#是最好的语言。。。。

发帖数: 1
31
關於golang的NUMA,我找到文檔了,2014年設計,至今(2018年)沒有人實現,說明不
容易。老毛子就是有人才啊,Dmitry Vyukov
https://docs.google.com/document/u/0/d/1d3iI2QWURgDIsSR6G2275vMeQ_X7w-
qxM2Vp7iGwwuM/pub
https://groups.google.com/forum/#!topic/golang-dev/Hjj3fPBLXlk

发帖数: 1
32
这里面讲了,为什么goroutine太多,在多路众核处理器上会大量造成cache-line miss
和ping-pong效应。我们目前最强的机器是2路200+核心16个内存控制器,还没有测试,
估计golang性能因为scheduling会很难看。做处理器的最怕跨路访问内存,一个load应
该有200~300ns延时,再加上超标量,相当于等待成百上千条指令啊,性能下降10倍算
少的。
The main concepts in Go runtime are:
M - OS thread (Machine).
P - Logical CPU (Processor), there are exactly GOMAXPROCS P's.
G - Goroutine.
Netpoll - network poller (epoll descriptor).
RunQ - scheduler queue with runnable G's.
MHeap - global memory allocator state (contains central caches and free
spans)... 阅读全帖

发帖数: 1
33
多谢回复,这个GC问题正是我碰到的,没想到GOGC还能设置超过100的数,而且还能非
线性优化,真是个坑,看来GOGC任重道远啊。我本以为GOGC=off就万事大吉了。
y*j
发帖数: 3139
34
把GC完全关掉,时间一长,非耗尽内存空间不可。


: 多谢回复,这个GC问题正是我碰到的,没想到GOGC还能设置超过100的数,而且
还能非

: 线性优化,真是个坑,看来GOGC任重道远啊。我本以为GOGC=off就万事大吉了。

b*******s
发帖数: 5216
35
golang + docker may be the best practice
y*j
发帖数: 3139
36
Csharp 也是我的favorite。java和它相比很粗糙,cpp 和它相比又太复杂混乱。


: 俺一直都说,C#是最好的语言。。。。


发帖数: 1
37
CSharp在Linux、非x86架构下有性能很好的编译器和库么?
听说.NET开源的只是核心库,不是全部,不知道未来怎样。还有IDE和社区,这也很重
要。

发帖数: 1
38
关键是GOGC=off性能比GOGC=2400差,不知道为什么。。。
y*j
发帖数: 3139
39
我自己瞎猜的,如果内存一点也不释放的话,会损失Cache locality, 内存空间会碎片
化。


: 关键是GOGC=off性能比GOGC=2400差,不知道为什么。。。

d***a
发帖数: 13752
40
内存用的太多,会增加page fault rate。I/O系统忙起来,比频繁的cache miss更厉害。
s********k
发帖数: 6180
41
用.Net core,比之前那个overhead很高的.net好很多,关键是LINQ比Java 新的那个
stream好用啊
s********k
发帖数: 6180
42
page fault不是忙IO把,是swap出去之后重新load进TLB很花时间?

害。
s********k
发帖数: 6180
43
如果本来就是在VM上面再加pod上运行container,这个NUMA的作用还会很大吗?因为没
法控制底层的OS,golang也很难做好scheduler把?

miss
s********k
发帖数: 6180
44
我觉得你是不是可以换个方法实验
你目前的实验室基于一个200+核心直接run bare golang的http server?但是实际上很
多golang打包container的都是基于pod的,可以试一下k8s,比如你开# of core 个VM
?然后pin每个VM到一个core成为一个node,再每个node上再开2个pod?
所以你原来的测试是1个http server 开N个goroutine,现在变成每个pod上开一个http
server,就应该是1个http server开N/200/2个goroutine
这样的scheduler问题就完全变了。不知道效果如何

miss
y*j
发帖数: 3139
45
看那个报告的样子,应该还没有到经常page fault 的地步,否则性能会下降得非常厉
害。


: 内存用的太多,会增加page fault rate。I/O系统忙起来,比频繁的cache miss
更厉害。

d***a
发帖数: 13752
46
从内存里做TLB refill大约是150-200个纳秒左右吧,page fault的延迟是毫秒级了。
d***a
发帖数: 13752
47
是的,不过如果把GC关掉长时间运行下去,page fault会增加的。

miss
s********k
发帖数: 6180
48
哦所以你意思是swap到disk上了?不做GC确实有可能,不过如果GC下多个goroutine频
繁调度不知道会不会频繁重新load TLB,golang的schedule好像在避免这个

发帖数: 1
49
.NET Core 2目前只支持Windows下的arm64,等Linux下也有arm64再開始轉吧。
Mono支持Linux的arm64,但性能應該不行(跟gcc 7.2比)

发帖数: 1
50
我們試過lxc和kvm,如果不是Xeon的CPU的話,性能會再下降一個數量級(因為host-
guest communication in kernel code),而且裡面坑特別多,就不細講了。另外
docker和k8s對非x86的支持也不是很好。
虛擬化和容器不是silverbullet,至少在性能上說。AWS最近就在去VM化,參考AWS
Nitro和baremetal EC2。如果同時用虛擬化和容器,或者雙重虛擬化,性能就別指望了。

VM
http
首页 上页 1 2 3 4 5 6 7 下页 末页 (共7页)