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

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

  •  
  •   vigidroid ·
    vigidroid · 169 天前 · 4247 次点击
    这是一个创建于 169 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我给路由器插了外置硬盘做 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  
       169 天前 via Android
    搞啥都没用,换设备吧,路由器就不是干这个活的
    thtznet
        2
    thtznet  
       169 天前
    CPU 指令集的缺失,路由器并不是设计用于做 SMB 共享用的,偶尔有点路由器有这个功能也是为了固件的备份等附带用途。
    BaseException
        3
    BaseException  
       169 天前
    建议说明一下用什么设备装的 openwrt ,架构、型号
    f165af34d4830eeb
        4
    f165af34d4830eeb  
       169 天前
    @BaseException #3 60M 内存,单核,带 USB ,盲猜是 MT7260A 配 128M 内存的电子垃圾
    deplivesb
        5
    deplivesb  
       169 天前
    什么架构的?
    我理解如果是硬路由,那他就不是用来干这个活的
    f165af34d4830eeb
        6
    f165af34d4830eeb  
       169 天前
    @f165af34d4830eeb #4 勘误,应该为 MT7620A
    shengyu
        7
    shengyu  
       169 天前
    SMB 协议肯定会占 CPU 呀,CPU 读取文件之后得封装成 SMB 数据包。局域网传输只涉及转发,不涉及复杂包处理。
    BaseException
        8
    BaseException  
       169 天前
    @f165af34d4830eeb #6 k2p 红米 ac 2100 那种差不多的。建议楼主还是用专门的设备跑这些需求吧。 @vigidroid
    herozzm
        9
    herozzm  
       169 天前
    任何设备都一样吧,解决办法就是群晖或者其他 nas 系统
    f165af34d4830eeb
        10
    f165af34d4830eeb  
       169 天前
    @BaseException ac2100 可比 7620A 强多了,那个至少是双核。7620A 都是小米路由 3 那个时代的产物了
    tomychen
        11
    tomychen  
       169 天前
    路由器:这锅老子不背,凭啥我一路由器干起了服务器的活?
    BaseException
        12
    BaseException  
       169 天前
    youxiachai
        13
    youxiachai  
       169 天前
    要么忍,要么换设备...
    vigidroid
        14
    vigidroid  
    OP
       169 天前
    @BaseException @f165af34d4830eeb @deplivesb
    是这款 https://openwrt.org/toh/hwdata/netgear/netgear_wndr3700_v4

    @deplivesb 是硬路由

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

    所以这是硬件瓶颈导致的吗?我还以为是 io 速度的瓶颈,cpu 的处理策略不对导致的。
    vigidroid
        15
    vigidroid  
    OP
       169 天前
    @shengyu 我没说清楚,和 smb 无关。比如硬盘本地的文件复制也会这样
    f165af34d4830eeb
        16
    f165af34d4830eeb  
       169 天前
    @BaseException #12 我也是之前折腾过小米路由 3 才略微了解这几个型号的 SoC ,ac2100 其实在 MIPS 架构里算不错的机型了。
    @vigidroid 如果你的设备支持潘多拉系统或者 padavan ,建议换这两个系统试试。这两个系统拓展性没有原版 openwrt 强,但是对低端设备的优化做得不错,外置硬盘读写速度或许有提升。另外就是外置硬盘,建议优先使用 ext 等文件系统,ntfs 读写也有不少额外负担。
    f165af34d4830eeb
        17
    f165af34d4830eeb  
       169 天前
    @vigidroid #14 抱歉#16 回复完了才看到你的回复,wndr3700v4 也是一个经典型号了,但是好像没找到 padavan 或者潘多拉的支持,那只能考虑换一下硬盘的文件系统了?
    f165af34d4830eeb
        18
    f165af34d4830eeb  
       169 天前
    #17 归根结底还是设备性能不足的问题,smb 其实也比较吃性能,在现在 pc 设备上体现不明显,但是在这种低端嵌入式设备上就容易出现性能不足的问题。如果真的有 nas 需求,建议还是用性能更好的设备去跑。
    vigidroid
        19
    vigidroid  
    OP
       169 天前
    @f165af34d4830eeb 感谢解答。硬盘是 ext4 ,貌似不是这个问题。
    是在考虑 nas 的(也该换了)。只是这个问题背后的原理让我困扰,不问不舒服(喜欢折腾自己)。
    felixcode
        20
    felixcode  
       169 天前 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.

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

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