ASP.NET Core 在路由器等 CPU 极差 内存极小的嵌入式设备上性能(并发)表现怎么样?

2022-04-03 00:33:26 +08:00
 rv54ntjwfm3ug8
4676 次点击
所在节点    程序员
38 条回复
INCerry
2022-04-03 15:21:09 +08:00
@seakingii
> 1. 独立打包出来 100K 是不可能的,那种情况应该是只编译了程序,没有带上运行时
这个是可以做的,只要别依赖那些库,直接用 system call ,只是没人想这么麻烦,开心的话还能直接用 C#写 UEFI 程序
https://github.com/MichalStrehovsky/zerosharp

> 4. .net 打包时可以加参数进行"裁剪","裁剪"后文件会相对更小.但是目前这个技术不是很成熟,有些引用分析不到,造成不正确的"裁剪",导致可能上线运行会出错.
这个不是 BUG ,主要是看你代码里面有没有用反射,如果用了反射这种那需要自己指定某些程序集不剪裁。

> 5.V2EX 前两天有个 GRPC 的性能测试报告,可以看出: .NET 写的程序性能接近甚至可能超过 RUST,但是占用的内存和 RUST 相对多一个数量级 179.23 MiB VS 18.35 MiB
.NET 是带 GC 的语言,在默认情况下,有多少内存占用多少内存,这样是性能最好的。可以自己设置堆大小和内存节省模式,grpc-bench 我用 gzh 压测 1.5wqps 大约 60m 内存。
https://docs.microsoft.com/zh-cn/dotnet/core/runtime-config/garbage-collector#conserve-memory
https://docs.microsoft.com/zh-cn/dotnet/core/runtime-config/garbage-collector#heap-limit
INCerry
2022-04-03 15:23:51 +08:00
@ragnaroks 可以试试配置下 gc 的 heaplimit 和 conserve-memory 参数,不过 minecraft 还是比较重的,路由器上跑这种相对来说重应用,确实比较难为它了
INCerry
2022-04-03 15:28:17 +08:00
@opengps 我同意这位回答,内存占用和 CPU 占用主要看你的优化,和语言关系没那么大。垃圾的算法和代码,啥语言都没办法拯救。C#上用的优化方法有很多比如:使用结构体替换类、使用栈上分配、使用非托管内存、对象池化、指定内存分配到固定堆、使用 Span 和 Memroy 、计算使用 SIMD API 等等、指针和 unsafe 操作等等。
总得来说就是人很行就不用管路平不平
seakingii
2022-04-03 19:12:55 +08:00
@INCerry 楼主要讨论的适合不适合,而不是极限情况下能不能做.如果用.NET 什么都要都考虑各种细节,这样的用法应该是不推荐的.除非没有其它选择了.

我没有否认某些情况下"能运行" .NET 程序 ,但目前绝对不是嵌入式设备的好的选择.
INCerry
2022-04-03 19:45:01 +08:00
@seakingii 当然,我也没有否认你的观点,大多数是赞同的 :) 。我今天尝试了一下最新的.NET AOT ,发现 HelloWorld 和简单的 Socket 程序只要 1mb 大小,以及 2m 左右的运行空间。
在.NET 也有针对嵌入式设备的特殊运行时如 NanoFreamwork ,可以在 STM32 之类的嵌入式设备运行,而且有很多商业案例。
https://github.com/nanoframework/Home
seakingii
2022-04-03 19:51:21 +08:00
@INCerry 你说的是 NativeAOT 吧?那个我也很期待,等了七八年了

特殊运行时,感觉这些都太偏门了.以前学习用 go 做 wasm 的时候,发现有个 tinygo ,能生成更小的程序,但总有这样限制那样限制.所以我个人的观点是,如果可以选择,目前还是不要用.net 搞嵌入式的程序...除非没办法或者特别想用
seakingii
2022-04-03 19:53:46 +08:00
@INCerry 你提到的这个 NanoFramework 有点意思,有空学习下
beyondex
2022-04-03 20:28:26 +08:00
.NET Core 性能蛮好的,但是它官方推荐的框架(比如 ASP.NET Core )是比较重量级的,所以默认它是比较吃内存的,但是如果你的应用程序业务简单,也是可以进行简化,删掉不需要的组件,但是也需要试一下才知道。
caotian
2022-04-03 21:54:01 +08:00
mipse 和 arm 的路由器上都开发过 go 写的程序, 性能还好, go 编译完就几 M, 加上几个常用库, 包括 gin 也就 10M 出头, 还不错.
moonheart
2022-04-03 22:13:17 +08:00
roundgis
2022-04-03 23:36:49 +08:00
@INCerry nsnoframework 已經可以商用了?
INCerry
2022-04-04 11:15:23 +08:00
@roundgis
是的 你加入他们的 Discord channels 看看,已经有很多人用于生产了
roundgis
2022-04-04 12:35:22 +08:00
@INCerry 謝謝告知
hez2010
2022-04-05 12:44:11 +08:00
试了一下,使用 asp.net core 包含完整的 runtime 进行自包含发布,然后服务端渲染出一个完整的 HTML 页面出来,编译后体积 32mb ,运行之后占用内存 34mb 。所以你这个有 128mb 内存的话我觉得还是没问题的。

![测试结果]( https://s1.328888.xyz/2022/04/05/LKY7y.jpg)
hez2010
2022-04-05 12:45:41 +08:00
@hez2010 发布命令用的是 dotnet publish -c Release -r win-x64 /p:PublishTrimmed=true /p:PublishSingleFile=true
jeeyong
2022-04-06 04:35:14 +08:00
你们聊,我就吐槽一下。python 打包的自动化项目,所有依赖都装进去,到新环境直接 exe 启动的,800mb ,哈哈哈哈哈
sjzjams
2022-04-06 08:40:26 +08:00
前三楼说你们点啥 哈哈
cs8425
2022-04-13 16:32:28 +08:00
来晚了
之前工作上有稍微测试过
linux x84_64 (i7-4710HQ)
.net 5 vs golang 1.13.x 还 1.14.x
跑 websocket 测带宽
纯 http lookback 都可以跑满 CPU, 大概都有 3G+bps 左右
https 的情况下.net 效能比 golang 好
.net 约 500Mbps 内存约 200MB
golang 约 300~400Mbps 内存约 80MB

另一个测试是把 url 映射到 zip 档内的档案(碎档并发读取+解压缩, 都只用标准库)
https 带宽上限跟上面的差不多
但内存用量差异非常大
golang 不最佳化的情况下 内存占用约 130MB
.net 内存 500MB 起跳 并发越高吃越多内存
4C 的情况下有吃超过 6GB 结果 OOM...
基本大概抓 1C 吃 1.5 ~ 2GB 比较保守

打包后的执行档
golang 用 ldflags="-s -w" 约 5.6MB
.net AOT 不带 runtime 约 4MB
带 runtime 基本接近 100MB

回到标题, 个人还是选 golang

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844665

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX