V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  lesismal  ›  全部回复第 20 页 / 共 54 页
回复总数  1070
1 ... 16  17  18  19  20  21  22  23  24  25 ... 54  
2023-04-17 15:27:03 +08:00
回复了 zhangolve 创建的主题 程序员 大佬的起诉书公布了大佬的工资待遇
@trlove 看到#78 里的 1800w 我没看懂,看到#79 的 700 多 w ,我还是没看懂,其他楼层都说是 150 ,700 多是怎么算出来的:joy:。。。
上一楼手滑发布了,接#52

SIMD 的优点?我们普通应用场景中有很多情况下需要对大量数据执行相同的操作,例如图片处理、视频特效等,在这种时候使用 SIMD 指令能取得很大的性能提升。例如 SSE 指令,支持每次对 4 个 FP32 进行操作,那么我们常用的 Vector4 向量加减乘除,皆可使用一个指令完成,效率大大提高。

SIMD 的缺点?有得必有失,为 SIMD 优化的程序在处理分支指令时性能不佳,因为分支指令本质上是一部分数据流根据条件去执行不同的指令,当多个数据流需要运行的分支不同时,需要运行两次程序遍历来完成所有数据流的操作。此外,不是所有情况下都需要很高的并行度,典型例子就是 AVX512 指令。虽然理论上一次能处理 16 个 FP32 ,但很难遇到需要同时处理这么多数据的场景。常见的向量、矩阵计算,操作单位都是 Vector4 ,要适配 AVX512 就需要大改程序流程和算法,去把好几个数凑起来一起操作,边际效应明显。而且在前几代 CPU 上 AVX512 还有降频问题,一跑起来频率上不去,速度还不一定有 SSE 快。

所以,常规主流业务的普通 size 结构场景下,simd 是否还有优势?

3. simdjson 和 MessagePack c 编译优化是如何的,比如都是 O1 还是 O2 还是 O3 ,实际场景允许到 O3 不?
@icyalala
> 体积:相差并不大
> json: 467KB
> msgpack: 402KB
> 在手头 M1 上跑 simdjson 和 msgpack-c 来解析,循环 16 次
> simd:dom: 759MB/s
> simd:ondemand: 1604MB/s
> msgpack-c: 948MB/s

另外,这种性能对比是存在一些不合理的:
1. 是应该对比相同结构的序列化反序列化次数,而不是对比每秒处理了多少 MB/GB
2. 这种 size 的结构已经是非常大了,实际的业务中,单个消息体这么大的时候应该是少数场景。所以也应该考虑常规 size 的结构的压测对比,我对 simd 指令没做过什么研究,随便搜了一段:
@icyalala
我不是挺 MessagePack ,我自己主业务也基本不用它。
但是单就性能而言,这里还是有个市场占有率的问题。因为 MessagePack 用户没那么多、像 #45 @hengyunabc 所说的,作者也没那么大精力和动力去做更大的性能优化。如果很多很多人用,MessagePack 的性能应该是可以做到比 simdjson 更强的,因为需要处理的字节数、逻辑肯定是比 json 少一点的,simd 指令能用来优化优化 json 也可以用于 MessagePack ,比如 simdjson 作者去实现 MessagePack 。

> 也没验证 UTF-8 编码

MessagePack 本来就是二进制,当然是不需要验证 utf8 的,主要还是 simd 针对性优化太强。


@duke807
> 至于其它通讯格式,我当然知道它们的存在,我也知道它们是怎么死的,我一开始就不看好它们,无论是 xml 还是 protobuf

xml 没死,protobuf 更是没死,只是 web 领域用的人少罢了。大规模服务集群之间的 RPC ,pb 占有率还是很高的,游戏行业 pb 的占有率也非常高。


一些传统 c/cpp 领域,不涉及深拷贝的,就是 c struct 1 字节对齐,直接 struct 地址拷贝传输,性能和 buffer size 都是无敌的。

二位没必要争执这些,http1x 性能和流量浪费都那么垃圾也照样统治着互联网。技术栈的市占率都是历史综合因素造成的,自己家的业务选择自己认为适合的、自己喜欢的就行了。
2023-04-16 13:33:28 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@Nazz 还没试过,尝试这个要改造的工作量也不小
1. MessagePack 和 Json 都是自释的,都带有了 key 信息,都是相当于动态结构
2. MessagePack 二进制、省去了 Json 的那些双引号、冒号、逗号、括号之类的,能省一些但毕竟 key 信息还在
3. PB 这种是 c/s 各自都持有了消息体的定义,根据消息定义的字段顺序进行序列化、反序列化时根据消息定义的字段顺序从 buffer 里挨个取出来解析就可以了,不需要把 key 信息也放到序列化后的数据里,而且本身也不需要引号冒号那些,所以节省更多。一些数值类型会做一些压缩,比如 int64 需要 8 字节但当前的值比较小、2 字节就够了,那就省一点。MessagePack 是否也有这个数值压缩我不记得了,好像是也有的
4. 不管用哪种,如果消息结构定义的重复率比较高、序列化后的包体 size 比较大,通常 gzip 之类的压缩算法加一道,就省更多了

用 Json 更灵活、自由、方便,版本更新升级做兼容性也容易
用 PB 更严格、工程化、规范,版本升级要考虑协议兼容性的更多、要考虑 c/s 是否必须同步停服维护升级之类的
MessagePack 挺不错,但是不如 Json 那种明文、方便调试之类的,它相比于竞品,优点都是处于中间水平,省流优秀但不是最佳、自释义但不明文,而且出生也晚,所以反倒是用的人最少
2023-04-16 13:02:10 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@lesismal #27
应该是要考虑阈值的问题:
如果 c 的功能比较复杂、c 开销+cgo 的开销大于纯 go 实现的开销,就没必要。比如一个简单的 sum(a, b),妥妥的纯 go 划算。否则 cgo 搞,还是有提升空间。
2023-04-16 12:57:53 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@Nazz
#9 的结论不太对。我上次测试,是用纯 c 对比 go 里用 cgo 调 c ,纯 c 确实快很多。但是实际应该是对比纯 go 和 cgo 。搜了下刚好有其他人做了 openssl 的 cgo wrap ,他的 benchmark 数据好于纯 go 。。。
所以应该还是有的搞
两码事吧:
标准库里已经支持的 syscall ,应该是不走 cgo 的。
标准库里没支持的 syscall ,用户自己 cgo 的方式,那是要损失性能。
2023-04-16 12:47:45 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@lysS
> go 的 tls 以及那些套件都是标准库支持的,你弄过来有啥意义?

哦。

因为:
1. 标准库的 tls 只支持同步读的解析,这意味着,需要单独一个协成处理读
2. 不只是标准库的 tls ,从 net.TCPConn 到 net/http ,都是同步读的解析,都需要单独一个协成
3. 海量连接的场景,每个连接一个协程对硬件消耗太多了,单个节点协程多了以后,内存、调度、GC & STW 都对进程的健康度不够友好,对企业成本、能源消耗和环保也都不友好
4. 我搞 nbio 是为了解决 3 的问题,解决 3 的问题,就要避免每个连接一个协程的方案,回归其他传统语言的异步方案。虽然 go 底层也是异步 io ,但是如 1/2 所述,标准库提供给用户的同步接口导致海量连接数场景下协程爆炸问题。所以实际上是要做 event driven+async io+nonblocking user interface 。所以 nbio.Conn 实现了异步的 net.Conn ,也实现了异步流解析的 http parser ,也魔改了标准库 tls 实现了异步流解析的 tls

大多数人都会说,实际业务没那么大连接数,即使多一些,堆机器也足够了。
可能大家业务不一样吧,我处理的业务量相对而言,稍微多一点,能省不少,而且也有些老外在用我的库去做类似的事情。通常大中厂的业务量,用我的这个,相比于标准库,都能节省不少资源。
不知道这算不算有意义
2023-04-09 13:52:08 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@Nazz cgo 以前只是用、没做过压测。刚试了下,确实拉垮,这下好了,我不用再惦记 #4 这事了 :joy:
2023-04-09 13:16:26 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@Nazz 不涉及 syscall ,只是 buffer 传递、解析回调 /回传,这点跨语言栈之间的小结构体字段拷贝开销应该不会很大( buffer 强转避免大段 buffer 的跨语言栈拷贝)
2023-04-09 12:57:34 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@Nazz c++/rust 性能强,但开发效率太低了,所以我才会有 #4 的想法,性能与开发效率兼得、性能和消耗的损失更小
2023-04-09 12:56:22 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
@Nazz 我最近都在琢磨,要不要单独弄个库,然后把 openssl cgo 弄到 nbio 里用,还有 nodejs 那个 c 的 httpparser 也弄进来,这样性能和内存都能再优化一波,并且如果不考虑兼容标准库 http 的话,性能也能做更大优化,但就不是 pure go 了。
需要不少工作量,我有点懒得动 :joy:
2023-04-09 11:36:36 +08:00
回复了 Nazz 创建的主题 程序员 有必要在海量长连接场景使用第三方网络库吗?
6w 不算海量,连接数几十万上百万甚至两百万,差别就大了。
正常的业务也不至于每个连接上都是压测的场景、很高交互频率,普通业务的交互频率,逻辑代码本身需要的 cpu 不至于那么极端所以用标准库,这种逻辑代码本身的 cpu 需求也是够用。优化主要是为了:
1. 节省内存总量从而降低硬件总成本:一般中厂的业务量,比如 500w 连接数,用标准库单硬件 4/8c 8-16g ,稳定起见,单个节点处理 10-20w 连接,要部署 25-50 个节点。如果用其他方案,相同配置单个节点可以处理 100w 连接数,则5个节点就够用了。这是中厂业务,如果大厂、云基础设施,在线数、节点数量可比这大的多,能省下的成本也是不小。
2. 控制协程数量,降低调度成本:虽然 go 的调度很优秀了,但是比如百万个协程毕竟还是太多了
3. 控制对象数量,降低 gc 造成的 cpu 压力。上面说了,普通交互频率的逻辑代码 cpu 需求压力不大,但是对象数量巨大、gc 本身的消耗就很大,偶尔请求高一秒 stw 可能就比较明显了,还容易 cpu 尖刺

多数人需要处理的业务量级都不是特别大的,所以就用标准库足够了。
真正有大需求的,还是需要搞搞的。
@bv 虽然没怎么看,但隔三岔五就会看到有人夸赞,可以看出其实作为 golang 知识传播、做得算是不错了。知识培训机构这种和实战差别还是很大,尤其是好些人习惯了不管是啥自己先造个轮子再说,直接使用标准库 timer 比他这个好得多却非要画蛇添足。不只是 zinx ,其他一些培训机构、某些厂出的号称”架构师“的 go 框架也差不多
2023-04-02 22:59:04 +08:00
回复了 rzdCG 创建的主题 职场话题 收到 offer 了,学历造假了,感觉有点慌
尊敬的 HR 和面试官你们好:
很荣幸能收到贵司 offer ,也非常感谢各位在面试过程中在我身上花费的宝贵时间和精力!
但请容许我先坦白一件事:我投递的简历中学历时假的,真实简历为 xxx 。
我并不是想靠学历造假这种不诚信的方式进入公司,只是因为如果学历不造假,连面试机会都拿不到,才出此下策——先在面试中证明自己的技术能力后再坦诚相告。
是否继续录用,请您各位审议我的实际情况后再做出决定,期待您的回复,也非常期待能有机会加入你们!

再次感谢!
2023-04-02 22:16:52 +08:00
回复了 FrankFang128 创建的主题 Go 编程语言 无废话的 GoLang 教程 [免费] [视频]
我对教程没兴趣,但是 up 普通话标准,语速适当,语言简洁,面相也符合行业职业特点。
平时不刷各种站,所以我只能在这帖子留言支持一下!
@gitxuzan @pubby
我这个能让你们代码更简单,老业务当然没必要去浪费时间替换,但是新业务的话,欢迎试驾。。。
https://github.com/lesismal/arpc
性能也还可以:
https://colobu.com/2022/07/31/2022-rpc-frameworks-benchmarks

易用性和扩展性请看看示例,该有的基本都有了
名字带了 rpc 但其实是全功能的网络库,server 主动发消息都可以的,也不限制 rpc 的方式,也可以只是推送消息不需要另一端响应,client/server side 都可以做这些,做游戏网络库可以,做 IM 可以,做 RPC 可以,做推送服务之类的都可以。支持中间件之类的各种扩展。支持前端 js client 而且也能用 http ,所以 web 前端一把梭也可以。常见的游戏客户端引擎基本都支持 js ,所以用来做游戏也可以一把梭。
在一些对性能要求极致的比如 fps 游戏,当然我还是会自己定制网络库,把中间件之类的不必要的代码去掉,把协议头做更极致的优化。
@pubby
接入层如果也是用 go ,还可以考虑用我这个来承载大量连接降低硬件消耗:
https://github.com/lesismal/nbio
如果不是用 go 而是用 nginx 那些,就不需要我这个了,除非为了一些功能开发方便

@gitxuzan @fridaycatye
刚看了一眼你们冰哥哥的代码,比如:
https://github.com/aceld/zinx/blob/master/ztimer/timer.go#L76
这种定时器要在到期前一直占用一个协程。而标准库 time.AfterFunc 只要在到期时启动一个协程、执行完就退出。
冰的这种代码,太不适合真正的大项目了,也就玩玩小项目能干翻 py 这些。
学思路可以,别被这些理论派、缺少实战的 up 把自己带偏了。
这代码辣眼睛,不继续看了。
1 ... 16  17  18  19  20  21  22  23  24  25 ... 54  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1043 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 32ms · UTC 19:29 · PVG 03:29 · LAX 12:29 · JFK 15:29
Developed with CodeLauncher
♥ Do have faith in what you're doing.