V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
vigidroid
V2EX  ›  Linux

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

  •  
  •   vigidroid ·
    vigidroid · 2022-01-06 14:13:48 +08:00 · 6396 次点击
    这是一个创建于 1051 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我给路由器插了外置硬盘做 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 小白,请教一下,有没有什么思路解决这种问题?
    48 条回复    2022-01-10 02:06:02 +08:00
    Tink
        1
    Tink  
       2022-01-06 14:18:52 +08:00 via Android
    搞啥都没用,换设备吧,路由器就不是干这个活的
    thtznet
        2
    thtznet  
       2022-01-06 14:47:56 +08:00
    CPU 指令集的缺失,路由器并不是设计用于做 SMB 共享用的,偶尔有点路由器有这个功能也是为了固件的备份等附带用途。
    BaseException
        3
    BaseException  
       2022-01-06 14:51:07 +08:00
    建议说明一下用什么设备装的 openwrt ,架构、型号
    f165af34d4830eeb
        4
    f165af34d4830eeb  
       2022-01-06 14:53:33 +08:00
    @BaseException #3 60M 内存,单核,带 USB ,盲猜是 MT7260A 配 128M 内存的电子垃圾
    deplivesb
        5
    deplivesb  
       2022-01-06 14:54:37 +08:00
    什么架构的?
    我理解如果是硬路由,那他就不是用来干这个活的
    f165af34d4830eeb
        6
    f165af34d4830eeb  
       2022-01-06 14:57:27 +08:00
    @f165af34d4830eeb #4 勘误,应该为 MT7620A
    29EtwXn6t5wgM3fD
        7
    29EtwXn6t5wgM3fD  
       2022-01-06 15:00:14 +08:00
    SMB 协议肯定会占 CPU 呀,CPU 读取文件之后得封装成 SMB 数据包。局域网传输只涉及转发,不涉及复杂包处理。
    BaseException
        8
    BaseException  
       2022-01-06 15:03:06 +08:00
    @f165af34d4830eeb #6 k2p 红米 ac 2100 那种差不多的。建议楼主还是用专门的设备跑这些需求吧。 @vigidroid
    herozzm
        9
    herozzm  
       2022-01-06 15:03:29 +08:00
    任何设备都一样吧,解决办法就是群晖或者其他 nas 系统
    f165af34d4830eeb
        10
    f165af34d4830eeb  
       2022-01-06 15:09:27 +08:00
    @BaseException ac2100 可比 7620A 强多了,那个至少是双核。7620A 都是小米路由 3 那个时代的产物了
    tomychen
        11
    tomychen  
       2022-01-06 15:13:03 +08:00
    路由器:这锅老子不背,凭啥我一路由器干起了服务器的活?
    BaseException
        12
    BaseException  
       2022-01-06 15:14:38 +08:00
    youxiachai
        13
    youxiachai  
       2022-01-06 15:20:24 +08:00
    要么忍,要么换设备...
    vigidroid
        14
    vigidroid  
    OP
       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
        15
    vigidroid  
    OP
       2022-01-06 15:24:43 +08:00
    @shengyu 我没说清楚,和 smb 无关。比如硬盘本地的文件复制也会这样
    f165af34d4830eeb
        16
    f165af34d4830eeb  
       2022-01-06 15:25:03 +08:00
    @BaseException #12 我也是之前折腾过小米路由 3 才略微了解这几个型号的 SoC ,ac2100 其实在 MIPS 架构里算不错的机型了。
    @vigidroid 如果你的设备支持潘多拉系统或者 padavan ,建议换这两个系统试试。这两个系统拓展性没有原版 openwrt 强,但是对低端设备的优化做得不错,外置硬盘读写速度或许有提升。另外就是外置硬盘,建议优先使用 ext 等文件系统,ntfs 读写也有不少额外负担。
    f165af34d4830eeb
        17
    f165af34d4830eeb  
       2022-01-06 15:27:45 +08:00
    @vigidroid #14 抱歉#16 回复完了才看到你的回复,wndr3700v4 也是一个经典型号了,但是好像没找到 padavan 或者潘多拉的支持,那只能考虑换一下硬盘的文件系统了?
    f165af34d4830eeb
        18
    f165af34d4830eeb  
       2022-01-06 15:32:52 +08:00
    #17 归根结底还是设备性能不足的问题,smb 其实也比较吃性能,在现在 pc 设备上体现不明显,但是在这种低端嵌入式设备上就容易出现性能不足的问题。如果真的有 nas 需求,建议还是用性能更好的设备去跑。
    vigidroid
        19
    vigidroid  
    OP
       2022-01-06 15:44:19 +08:00
    @f165af34d4830eeb 感谢解答。硬盘是 ext4 ,貌似不是这个问题。
    是在考虑 nas 的(也该换了)。只是这个问题背后的原理让我困扰,不问不舒服(喜欢折腾自己)。
    felixcode
        20
    felixcode  
       2022-01-06 15:53:24 +08:00 via Android   ❤️ 1
    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
    xuboying
        21
    xuboying  
       2022-01-06 16:01:51 +08:00
    硬盘是 ext4 ,这是个有日志支持的文件系统。如果只是当网盘用这个文件系统太重量级了。用 FAT 家族试试。
    fhbyljj
        22
    fhbyljj  
       2022-01-06 16:20:39 +08:00 via Android
    @f165af34d4830eeb 你是怎么知道的
    BaseException
        23
    BaseException  
       2022-01-06 16:29:15 +08:00   ❤️ 1
    @f165af34d4830eeb #16
    @vigidroid #14

    我虽然也是通过路由器 all in one ,但是 cpu 是赛扬 N3150 ,四核心四线程,还跑 qbit 挂 pt 之类的,跑 samba ftp 之类的不在话下。
    [![Tznmid.png]( https://s4.ax1x.com/2022/01/06/Tznmid.png)]( https://imgtu.com/i/Tznmid)
    vigidroid
        24
    vigidroid  
    OP
       2022-01-06 16:35:30 +08:00
    @BaseException 很棒。用的什么系统
    f165af34d4830eeb
        25
    f165af34d4830eeb  
       2022-01-06 16:43:20 +08:00
    @fhbyljj #22 你是指#4 的内容么?根据 op 最开始的描述,mt7620A 是最有可能的,当然我是没想到 op 用的是更古老的 wndr3700v4 。
    f165af34d4830eeb
        26
    f165af34d4830eeb  
       2022-01-06 16:44:46 +08:00
    @BaseException #23 我前段时间用 10 代 i3 装了一台 NAS ,具体可以参考 https://v2ex.com/t/823843#reply92
    f165af34d4830eeb
        27
    f165af34d4830eeb  
       2022-01-06 16:48:52 +08:00
    @f165af34d4830eeb #26 又打错了,应该是 15 楼。。https://v2ex.com/t/823843#reply15
    BaseException
        28
    BaseException  
       2022-01-06 16:49:28 +08:00
    @vigidroid #24 就是 openwrt 但是不记得是谁编译的了,也没有原来的帖子。
    BaseException
        29
    BaseException  
       2022-01-06 16:50:34 +08:00
    @f165af34d4830eeb #26 垃圾佬的快乐~~~ 感谢分享
    strongcoder
        30
    strongcoder  
       2022-01-06 16:59:18 +08:00
    我搞了个 J3455 为核心的 ALL IN ONE, PVE 做底层虚拟化,上面跑三个系统 一个精简版 WIN7 一个 DSM 一个 OPENWRT 日常内网 传输千 M 跑满也没啥 IO 瓶颈问题啊 ,还是 CPU 性能问题
    james122333
        31
    james122333  
       2022-01-06 17:18:01 +08:00
    是可以调整 小机器一样可以飞 但任性点总得要充实知识
    vigidroid
        32
    vigidroid  
    OP
       2022-01-06 17:24:44 +08:00
    @james122333 求带个路,我去学
    respawn
        33
    respawn  
       2022-01-06 17:43:44 +08:00
    削皮刀和菜刀
    ysc3839
        34
    ysc3839  
       2022-01-06 18:21:07 +08:00
    建议只看 CPU 使用率,准确说是 CPU 非空闲时间百分比,不要去看其他各种参数,尤其是自己不懂的情况下
    lazywen
        35
    lazywen  
       2022-01-06 18:32:36 +08:00   ❤️ 1
    iowait 没有干等,只是一个计数而已,影响性能的是你的 user 、sys cpu 占用,因为就算是本地复制也需要 cpu 做很多工作的,而内网设备之间传输数据时 cpu 并没有 io 操作,只是在不停的解析包和转发包
    lazywen
        36
    lazywen  
       2022-01-06 18:34:27 +08:00
    更正一下,而内网设备之间传输数据时 cpu 并没有磁盘 io 操作
    dinfeo
        37
    dinfeo  
       2022-01-07 09:00:09 +08:00   ❤️ 1
    额,建议还是路由器干路由器的活,存储还是买个 NAS 吧,自组和成品都可以,分开来= =
    不然你在折腾的时候,存储挂了,路由器也挂了,= =都没法上网找解决方案。
    james122333
        38
    james122333  
       2022-01-07 09:28:23 +08:00
    @vigidroid
    这看你自己的了 发到这大家都看得到 不希望自己价值消失
    vigidroid
        39
    vigidroid  
    OP
       2022-01-07 10:07:57 +08:00 via Android
    @james122333 有货就发出来,没货就闭嘴
    power100
        40
    power100  
       2022-01-07 10:25:54 +08:00   ❤️ 1
    路由器外挂 usb 移动硬盘就是个功能添头,要求不高用用无所谓的,如果要把当服务器那就性能不够了。要么搞个 nas ,要么就是弄个 X86 CPU 的软路由吧,秒他十万八千里!
    james122333
        41
    james122333  
       2022-01-07 10:26:51 +08:00
    @vigidroid

    给的建议是自己研究碍到谁了? 只能说是有而已
    datocp
        42
    datocp  
       2022-01-07 17:58:34 +08:00 via Android
    只知道 mtk7620 开启 wifi,iperf 少了大概 50mbps 的吞吐量。。。
    fhbyljj
        43
    fhbyljj  
       2022-01-07 18:40:11 +08:00 via Android
    zeromake
        44
    zeromake  
       2022-01-08 11:09:44 +08:00 via Android
    120 收了个 d2550 的软路由双网口,不过没有 usb3 只有 usb2 ,只能挂个 2.5 硬盘 sata 或者外置一个 3.5 硬盘了。
    Serino
        45
    Serino  
       2022-01-09 16:44:08 +08:00
    换成 SSD ,占用立马下去了
    Serino
        46
    Serino  
       2022-01-09 16:45:07 +08:00
    HDD ,千兆传输,CPU 占用可能因为 IO ,跑到 50%
    换成 SSD ,跑满千兆,大概就 10~15%的 CPU 占用
    TsukiMori
        47
    TsukiMori  
       2022-01-09 23:14:23 +08:00 via Android
    还是搞 x86 aio 吧 有预算的话就拆开
    拿现在这个干这么多事有点难为他了
    flynaj
        48
    flynaj  
       2022-01-10 02:06:02 +08:00 via Android
    不用怀疑就是性能太弱,7621 强一丝丝,要 samba 就上 x86,这个我是一步步走过来的,7620 ,7621 ,d525,j1900,换上目前用的 e3 1265 v3 ,终于路由器不再是瓶颈了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:28 · PVG 05:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.