为什么 openwrt 上本地的 io 操作会严重影响整体性能?

2022-01-06 14:13:48 +08:00
 vigidroid
我给路由器插了外置硬盘做 samba 服务。发现传输数据的时候(指局域网的设备读、写路由器硬盘数据,和路由器硬盘本地做数据 copy ),路由器性能会整体下降,具体体现在:
1. Load Average 增长到 3+( cpu 为单核)
2. iostat 命令显示: cpu %idle 为 0 ,cpu %iowait 很高,硬盘设备的%util 接近 100
3. ps 命令显示:smbd 进程 STAT 为 D

网上查了一圈,大概理解为 cpu 在干等 io 操作返回( iowait 高),极少腾出空闲处理其他事情,导致得卡顿。那我理解这种情况应该是有方法优化的。io 操作出现了瓶颈,cpu 应该放手 io 进程,转而积极处理其他进程。为什么现在不是这样?
这个和路由器的内存少有没有关系,是不是搞个 swap 会有效(现在没有 swap ,内存 60MB )?
还有个问题,为什么同样是 io copy ,局域网设备之间的传输就不会导致路由器 cpu 的 iowait 升高。

本人 linux 小白,请教一下,有没有什么思路解决这种问题?
6011 次点击
所在节点    Linux
48 条回复
Tink
2022-01-06 14:18:52 +08:00
搞啥都没用,换设备吧,路由器就不是干这个活的
thtznet
2022-01-06 14:47:56 +08:00
CPU 指令集的缺失,路由器并不是设计用于做 SMB 共享用的,偶尔有点路由器有这个功能也是为了固件的备份等附带用途。
BaseException
2022-01-06 14:51:07 +08:00
建议说明一下用什么设备装的 openwrt ,架构、型号
f165af34d4830eeb
2022-01-06 14:53:33 +08:00
@BaseException #3 60M 内存,单核,带 USB ,盲猜是 MT7260A 配 128M 内存的电子垃圾
deplivesb
2022-01-06 14:54:37 +08:00
什么架构的?
我理解如果是硬路由,那他就不是用来干这个活的
f165af34d4830eeb
2022-01-06 14:57:27 +08:00
@f165af34d4830eeb #4 勘误,应该为 MT7620A
shengyu
2022-01-06 15:00:14 +08:00
SMB 协议肯定会占 CPU 呀,CPU 读取文件之后得封装成 SMB 数据包。局域网传输只涉及转发,不涉及复杂包处理。
BaseException
2022-01-06 15:03:06 +08:00
@f165af34d4830eeb #6 k2p 红米 ac 2100 那种差不多的。建议楼主还是用专门的设备跑这些需求吧。 @vigidroid
herozzm
2022-01-06 15:03:29 +08:00
任何设备都一样吧,解决办法就是群晖或者其他 nas 系统
f165af34d4830eeb
2022-01-06 15:09:27 +08:00
@BaseException ac2100 可比 7620A 强多了,那个至少是双核。7620A 都是小米路由 3 那个时代的产物了
tomychen
2022-01-06 15:13:03 +08:00
路由器:这锅老子不背,凭啥我一路由器干起了服务器的活?
BaseException
2022-01-06 15:14:38 +08:00
youxiachai
2022-01-06 15:20:24 +08:00
要么忍,要么换设备...
vigidroid
2022-01-06 15:23:29 +08:00
@BaseException @f165af34d4830eeb @deplivesb
是这款 https://openwrt.org/toh/hwdata/netgear/netgear_wndr3700_v4

@deplivesb 是硬路由

@f165af34d4830eeb 你猜的差不多,是我 2015 年 200 多块买的垃圾,一直用到现在(惭愧)

所以这是硬件瓶颈导致的吗?我还以为是 io 速度的瓶颈,cpu 的处理策略不对导致的。
vigidroid
2022-01-06 15:24:43 +08:00
@shengyu 我没说清楚,和 smb 无关。比如硬盘本地的文件复制也会这样
f165af34d4830eeb
2022-01-06 15:25:03 +08:00
@BaseException #12 我也是之前折腾过小米路由 3 才略微了解这几个型号的 SoC ,ac2100 其实在 MIPS 架构里算不错的机型了。
@vigidroid 如果你的设备支持潘多拉系统或者 padavan ,建议换这两个系统试试。这两个系统拓展性没有原版 openwrt 强,但是对低端设备的优化做得不错,外置硬盘读写速度或许有提升。另外就是外置硬盘,建议优先使用 ext 等文件系统,ntfs 读写也有不少额外负担。
f165af34d4830eeb
2022-01-06 15:27:45 +08:00
@vigidroid #14 抱歉#16 回复完了才看到你的回复,wndr3700v4 也是一个经典型号了,但是好像没找到 padavan 或者潘多拉的支持,那只能考虑换一下硬盘的文件系统了?
f165af34d4830eeb
2022-01-06 15:32:52 +08:00
#17 归根结底还是设备性能不足的问题,smb 其实也比较吃性能,在现在 pc 设备上体现不明显,但是在这种低端嵌入式设备上就容易出现性能不足的问题。如果真的有 nas 需求,建议还是用性能更好的设备去跑。
vigidroid
2022-01-06 15:44:19 +08:00
@f165af34d4830eeb 感谢解答。硬盘是 ext4 ,貌似不是这个问题。
是在考虑 nas 的(也该换了)。只是这个问题背后的原理让我困扰,不问不舒服(喜欢折腾自己)。
felixcode
2022-01-06 15:53:24 +08:00
If the CPU is idle, the kernel then determines if there is at least one I/O currently in progress to either a local disk or a remotely mounted disk (NFS) which had been initiated from that CPU. If there is, then the 'iowait' counter is incremented by one. If there is no I/O in progress that was initiated from that CPU, the 'idle' counter is incremented by one.

原文在这
https://gist.github.com/haridsv/0d65d263b7f5f79a73e5

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

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

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

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

© 2021 V2EX