為什麼golang algernon比C nginx慢幾十倍?golang行嗎

j
jollyfish
101 楼
不明白。软件工程师不是也在被剥夺剩余价值?
本来软件既是生产资料又是劳动产出,结果给来了个开源。
唉唉唉

【 在 minquan (三民主义) 的大作中提到: 】
: 你和软件工程师只有一个本质差别:
: 你不掌握生产资料,所以只能被剥夺剩余价值
: 卡尔 马克思
N
Nisayer
102 楼
【 在 jollyfish (jollyfish) 的大作中提到: 】
: 不明白。软件工程师不是也在被剥夺剩余价值?
: 本来软件既是生产资料又是劳动产出,结果给来了个开源。
: 唉唉唉

你见过什么重要的东西做的很完美的搞开源的, 除了sun那个傻逼公司
j
jollyfish
103 楼
nginx

【 在 Nisayer (si fata sinata) 的大作中提到: 】
: 你见过什么重要的东西做的很完美的搞开源的, 除了sun那个傻逼公司
f
fangtuo2
104 楼
开源是牛逼但不被承认的社会底层的唯一出路,类似十月革命掀桌子

【 在 Nisayer(si fata sinata) 的大作中提到: 】

: 你见过什么重要的东西做的很完美的搞开源的, 除了sun那个傻逼公司
f
fantasist
105 楼
啥出路?做高质量开源能挣大钱?

【 在 fangtuo2 (方鸵) 的大作中提到: 】
: 开源是牛逼但不被承认的社会底层的唯一出路,类似十月革命掀桌子
:
m
minquan
106 楼
R就是这么搞的
一边开源
一边弄个收费高级版

还有Qt系列也是如此

【 在 fantasist (一) 的大作中提到: 】
: 啥出路?做高质量开源能挣大钱?
b
bingocat
107 楼
algernon三年四百多个星的野鸡库也敢用
想用go webserver, 试试caddy
l
lauxp
108 楼
速度不是唯一的要求

【 在 TeacherWei (TW) 的大作中提到: 】
: 其实所谓云架构,大多数是没啥必要的。
: VM慢了一个数量级以上,无论如何都不能justify。
: 被人收割骗钱而已。
m
magagop
109 楼
IO虛擬化目前只有intel的vt-d、sr-iov、apic-v做得很好,其他非x86架構都不行,因為軟件問題。別看白皮書介紹得簡單,裡面非常複雜,非常不好做,坑特別多。性能只有xeon可以接近裸機,這就是xeon佔領99.9%市場的原因,amd都不行。

【 在 digua (姚之FAN) 的大作中提到: 】
: 你用的nginx和golang algernon是I/O intensive的workload。如果跑compute
: intensive的workload,VM和裸机会很接近。
: 看起来你们用的硬件,对VM中的I/O部分的支持不好啊,不应该影响这么大。有可能
是I
: /O虚拟化的硬件支持不好。感觉你们的系统,要调的地方很多,工作量很大。:)
w
wwzz
110 楼
现在有自己DC的公司已经没几个了。以后也不太会有新的公司用自己DC了

【 在 silverhawk (silverhawk) 的大作中提到: 】
: 追求性能肯定要自己做,但是大部分应用上云架构主要是方便,开启服务,scale,
: monitor,啥都方便,等到服务做大了,再专门自己搞DC做
s
silverhawk
111 楼
做到500B市值以上一般都会有(FGAM等),100B估计开始考虑但是还是可以全在cloud
上,比如netflix,但是99%公司还没到追求极致性能就死掉了
【 在 wwzz (一辈子当码工) 的大作中提到: 】
: 现在有自己DC的公司已经没几个了。以后也不太会有新的公司用自己DC了
w
wwzz
112 楼
你提到的那些都是在 cloud 流行之前开始的,不存在从 cloud 转到 自己 DC 的。公
司规模越大,要转的代价就越大, 真不如乖乖给 aws 写支票。新的有一定规模的公司,除了 uber, 都在云上。

【在 silverhawk(silverhawk)的大作中提到:】
:做到500B市值以上一般都会有(FGAM等),100B估计开始考虑但是还是可以全在
cloud
:上,比如netflix,但是99%公司还没到追求极致性能就死掉了
f
fantasist
113 楼
Dropbox转到自己的DC了

【 在 wwzz (一辈子当码工) 的大作中提到: 】
: 你提到的那些都是在 cloud 流行之前开始的,不存在从 cloud 转到 自己 DC 的。公
: 司规模越大,要转的代价就越大, 真不如乖乖给 aws 写支票。新的有一定规模的公司
: ,除了 uber, 都在云上。
: :做到500B市值以上一般都会有(FGAM等),100B估计开始考虑但是还是可以全在
: cloud
: :上,比如netflix,但是99%公司还没到追求极致性能就死掉了
w
wwzz
114 楼
that was a bold move.

During its early years, Dropbox ran its entire operation on Amazon’s cloud computing service. But more recently it has moved much of its
infrastructure off AWS to cut down on costs. The company said that in 2016, it was able to shrink its cost of revenue by $35.1 million as part of its
AWS migration, which it refers to as “Infrastructure Optimization.” As
tech publication GeekWire notes, the data center move help saved
Dropbox about $75 million over a two-year period.

【在 fantasist(一)的大作中提到:】
:Dropbox转到自己的DC了
m
magagop
115 楼
感覺golang的默認goroutine設計模式有問題,下面是golang http microbenchmark的
perf report:

60.24% [kernel] [k] arch_cpu_idle
6.43% [kernel] [k] _raw_spin_lock
4.40% http [.] runtime.runqgrab
2.19% http [.] runtime.findrunnable

感覺golang如果有很多goroutine和thread,大部分時間都會用在runtime.runqgrab上
,然後runtime.futex會過載,導致系統60% CPU都是idle
m
magagop
116 楼
在runtime/proc.go裡面有很多lock(&sched.lock),

例如把goroutine放到global runq裡面就需要lock
func goschedImpl(gp *g) {
status := readgstatus(gp)
if status&^_Gscan != _Grunning {
dumpgstatus(gp)
throw("bad g status")
}
casgstatus(gp, _Grunning, _Grunnable)
dropg()
lock(&sched.lock)
globrunqput(gp)
unlock(&sched.lock)

schedule()
}

sched是runtime2.go裡面的一個全局變量
var (
allglen uintptr
allm *m
allp []*p // len(allp) == gomaxprocs; may change at safe
points, otherwise immutable
allpLock mutex // Protects P-less reads of allp and all writes
gomaxprocs int32
ncpu int32
forcegc forcegcstate
sched schedt
newprocs int32
)

schedt是一個type struct
type schedt struct {
// accessed atomically. keep at top to ensure alignment on 32-bit
systems.
goidgen uint64
lastpoll uint64

lock mutex

// Global runnable queue.
runqhead guintptr
runqtail guintptr
runqsize int32

// Global cache of dead G's.
gflock mutex

// Central cache of sudog structs.
sudoglock mutex

// Central pool of available defer structs of different sizes.
deferlock mutex
}

lock mutex就是32位變量
// Mutual exclusion locks. In the uncontended case,
// as fast as spin locks (just a few user-level instructions),
// but on the contention path they sleep in the kernel.
// A zeroed Mutex is unlocked (no need to initialize each lock).
type mutex struct {
// Futex-based impl treats it as uint32 key,
// while sema-based impl as M* waitm.
// Used to be a union, but unions break precise GC.
key uintptr
}

func lock實現極其簡單,就是先CAS看鎖了沒,然後spinning一會兒,最後futexsleep:
// This implementation depends on OS-specific implementations of
//
// futexsleep(addr *uint32, val uint32, ns int64)
// Atomically,
// if *addr == val { sleep }
// Might be woken up spuriously; that's allowed.
// Don't sleep longer than ns; ns < 0 means forever.
//
// futexwakeup(addr *uint32, cnt uint32)
// If any procs are sleeping on addr, wake up at most cnt.

func lock(l *mutex) {

// Speculative grab for lock.
v := atomic.Xchg(key32(&l.key), mutex_locked)
if v == mutex_unlocked {
return
}

if ncpu > 1 {
spin = active_spin
}
for {
// Try for lock, spinning. procyield(active_spin_cnt)
// Try for lock, rescheduling. osyield()

// Sleep.
v = atomic.Xchg(key32(&l.key), mutex_sleeping)
if v == mutex_unlocked {
return
}
wait = mutex_sleeping
futexsleep(key32(&l.key), mutex_sleeping, -1)
}
}
m
magagop
117 楼
所以我前面提到的golang性能的第二個問題不是algernon獨有,也是golang區別於c的
最大特點:goroutine。目前golang最多能有一千萬併發goroutines,換成內存也就是
幾十GB,對於AWS上的只有幾十GB的VM小系統估計夠用了,但是對於多路1TB共享內存大系統,golang目前沒有NUMA調度架構顯然不行。

測試golang http,其實變成了測試Linux sys_futex(),唉。。。
c
cxfcxf
118 楼
现在只有很极致的公司才追求那10%的性能优化 更多的追求实用 短平快
人家根本不care这点区别 再堆机器就是了 机器多少钱 我请人回来弄类似nginx的
memory trick得花多少钱 以后怎么维护? 升级 更新怎么办?
就想之前碰到一个公司 所有的http服务都是in house的 结果碰到H2 自己做的基于LVS的链接toss back不能用了不说 连H2的功能的prototype都要做好久
但是市场需求就是马上要H2 你怎么办? 只能去掉自己in house的LB
所有在用人成本 今后维护 各方面来说 真的可以追求那最顶点性能优化的公司也就没
几个
现在K8S这么热 大家都网上迁呢 谁在乎调度器和API被干爆了如何 多加几个就是了
m
magagop
119 楼
看清我的結論:性能差別10倍不止,不是10%,如果是50%,我都會說golang很好。但是差距1000%,我就呵呵了。

【 在 cxfcxf (MGM) 的大作中提到: 】
: 现在只有很极致的公司才追求那10%的性能优化 更多的追求实用 短平快
: 人家根本不care这点区别 再堆机器就是了 机器多少钱 我请人回来弄类似nginx的
: memory trick得花多少钱 以后怎么维护? 升级 更新怎么办?
: 就想之前碰到一个公司 所有的http服务都是in house的 结果碰到H2 自己做的基于
LVS
: 的链接toss back不能用了不说 连H2的功能的prototype都要做好久
: 但是市场需求就是马上要H2 你怎么办? 只能去掉自己in house的LB
: 所有在用人成本 今后维护 各方面来说 真的可以追求那最顶点性能优化的公司也就没
: 几个
: 现在K8S这么热 大家都网上迁呢 谁在乎调度器和API被干爆了如何 多加几个就是了
f
fantasist
120 楼
别钻牛角尖了,找到一个特殊的应用说性能差10倍以上,作为技术研究是好的,但没有实际意义。用Go写backend service的公司很多,碰到性能瓶颈,总会有fix或者
workaround。如果真的需要10倍性能,而Go无论如何都达不到的,就换更合适的语言写对应的模块唄。
【 在 magagop (magagop) 的大作中提到: 】
: 看清我的結論:性能差別10倍不止,不是10%,如果是50%,我都會說golang很好。但是
: 差距1000%,我就呵呵了。
: LVS
m
magagop
121 楼
http的goroutine和gogc不是特殊應用,是golang做web後台的基礎好麼,回去先看看什麼是goroutine和gogc再來回復。這兩個問題非常不好workaround,是golang區別於cpp語言的根子。

【 在 fantasist (一) 的大作中提到: 】
: 别钻牛角尖了,找到一个特殊的应用说性能差10倍以上,作为技术研究是好的,但没有
: 实际意义。用Go写backend service的公司很多,碰到性能瓶颈,总会有fix或者
: workaround。如果真的需要10倍性能,而Go无论如何都达不到的,就换更合适的语言写
: 对应的模块唄。
g
guvest
122 楼
做web后台那你就和java比啊。和cpp较劲为哪般呢。。。
任何语言和c/cpp,fortran,pascal比性能都没什么意义。
【 在 magagop (magagop) 的大作中提到: 】
: http的goroutine和gogc不是特殊應用,是golang做web後台的基礎好麼,回去先看看什
: 麼是goroutine和gogc再來回復。這兩個問題非常不好workaround,是golang區別於
cpp
: 語言的根子。
p
pharmacy
123 楼
这个说的不错
【 在 wwzz (一辈子当码工) 的大作中提到: 】
: 你提到的那些都是在 cloud 流行之前开始的,不存在从 cloud 转到 自己 DC 的。公
: 司规模越大,要转的代价就越大, 真不如乖乖给 aws 写支票。新的有一定规模的公司
: ,除了 uber, 都在云上。
: :做到500B市值以上一般都会有(FGAM等),100B估计开始考虑但是还是可以全在
: cloud
: :上,比如netflix,但是99%公司还没到追求极致性能就死掉了
m
minquan
124 楼
是不是这样理解

goroutine只能做到支持单机多核

例如8核还好用,32核效率就一般,再多了就扯了

分布式计算必须得换map reduce?

【 在 magagop (magagop) 的大作中提到: 】
: http的goroutine和gogc不是特殊應用,是golang做web後台的基礎好麼,回去先看看什
: 麼是goroutine和gogc再來回復。這兩個問題非常不好workaround,是golang區別於
cpp
: 語言的根子。
m
minquan
125 楼
别的行业的剥削基础是在于劳动者必须依附于某个大佬的公司才能开展工作,因为缺乏完成工作成果必备的生产资料,而代码工作者不需要。实在不爽了,自己出来单干或几个人合伙开个小公司都行,不需要缺它不可的需要大额资金投入的生产资料,例如刻芯片的机器。

所以码工是跳槽最频繁的职业,依然工资最高。很多老板反而是弱势群体。

【 在 jollyfish (jollyfish) 的大作中提到: 】
: 不明白。软件工程师不是也在被剥夺剩余价值?
: 本来软件既是生产资料又是劳动产出,结果给来了个开源。
: 唉唉唉