AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 756489
Accepted
wangt13
wangt13
Asked: 2023-09-14 14:50:23 +0800 CST2023-09-14 14:50:23 +0800 CST 2023-09-14 14:50:23 +0800 CST

关于在 MTD 上调整 Linux UBIFS 中文件系统缓存的问题

  • 772

我正在开发一个嵌入式Linux系统,内核是5.10.24,并且使用MTD上的UBIFS。

测试团队进行了一个测试,即写入磁盘文件(open依次为write、 、 ),然后关闭系统电源。close上电后,磁盘文件为空,没有真正写入数据。发现文件写入后,延迟1分钟左右,然后重启系统,文件就更新了!

我做了一些研究并得到了关注。

  1. ubifs 创建一个内核线程ubifs_bgt0_0,每大约 30 秒调度一次。它将缓冲区写入块层(也许我错了)。
  2. 为wbuf创建ubifs_bgt0_0定时器,定时器的周期设置为dirty_write_interval,定义为unsigned int dirty_writeback_interval = 5 * 100; /* centiseconds */,大约5秒。这与测试团队报告的 1 分钟延迟不符。
  3. 是/sys/block/mtdblock0/queue/scheduler,[mq-deadline]并且/sys/block/mtdblock0/queue/iosched/write_expire是 5000, 5 秒。

综合以上发现,我认为UBIFS中的文件写入将在5秒内写入FLASH。在此之前重新启动电源将导致数据丢失!

所以请先纠正我上面的分析。

然后,我想通过更改2和中列出的可调参数来验证我的分析3。
我将它们更改如下, echo 100 > /proc/sys/vm/dirty_writeback_centisecs并且echo 1000 > /sys/block/mtdblock2/queue/iosched/write_expire. 我想将FLASH写入时间从50秒减少到1秒。

通过上述更改,我运行了磁盘写入测试,并在 2 秒内重新启动系统。但令我惊讶的是,该文件没有正确写入!

我多次尝试将以上2个参数更改为不同的值(小于50秒),但如果系统在50秒内重新上电,我仍然无法将数据写入FLASH。

我使用Ftrace检查了文件写入后调用的函数echo 100 /proc/sys/vm/dirty_writeback_centisecs。

这是大约10秒的Ftrace(文件写​​入后)

######### 10 centiseconds

# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |
 1)               |  ubifs_write_iter() {
 1) + 18.334 us   |    ubifs_write_begin();
 1) + 10.833 us   |    ubifs_write_end();
 1) + 62.167 us   |  }
 ------------------------------------------
 1)    exe-399     =>   ubifs_b-72
 ------------------------------------------

 1)               |  mtd_write() {
 1)               |    mtd_write_oob() {
 1)               |      mtd_write_oob_std() {
 1)               |        emu_nand_write_oob() {
 1) ! 491.167 us  |          nand_do_write();
 1) ! 502.000 us  |        }
 1) ! 507.167 us  |      }
 1) ! 512.667 us  |    }
 1) ! 525.667 us  |  }

电源循环后不会写入磁盘文件。

这是我在文件写入后 60 秒内得到的函数跟踪。

# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |
 1)               |  ubifs_write_iter() {
 1) + 20.000 us   |    ubifs_write_begin();
 1)   9.000 us    |    ubifs_write_end();
 1) + 59.166 us   |  }
 ------------------------------------------
 1)    exe-924     =>   kworker-61
 ------------------------------------------

 1)               |  ubifs_writepage() {
 1) + 49.500 us   |    ubifs_write_inode();
 1) ! 110.000 us  |  }
 1)   3.833 us    |  ubifs_write_inode();
 0)               |  mtd_write() {
 0)               |    mtd_write_oob() {
 0)               |      mtd_write_oob_std() {
 0)               |        emu_nand_write_oob() {
 0) ! 477.666 us  |          nand_do_write();
 0) ! 489.000 us  |        }
 0) ! 493.833 us  |      }
 0) ! 500.000 us  |    }
 0) ! 516.500 us  |  }
 0)               |  mtd_write() {
 0)               |    mtd_write_oob() {
 0)               |      mtd_write_oob_std() {
 0)               |        emu_nand_write_oob() {
 0) ! 459.333 us  |          nand_do_write();
 0) ! 465.667 us  |        }
 0) ! 470.000 us  |      }
 0) ! 474.666 us  |    }
 0) ! 481.500 us  |  }
 1) + 54.333 us   |  ubifs_write_inode();
 1) + 26.000 us   |  ubifs_write_inode();
 1) + 20.666 us   |  ubifs_write_inode();
 1) + 19.834 us   |  ubifs_write_inode();
 1) + 14.000 us   |  ubifs_write_inode();
 1) + 13.667 us   |  ubifs_write_inode();
 1) + 11.500 us   |  ubifs_write_inode();
 1) + 14.333 us   |  ubifs_write_inode();
 0)               |  mtd_write() {
 0)               |    mtd_write_oob() {
 0)               |      mtd_write_oob_std() {
 0)               |        emu_nand_write_oob() {
 0) ! 471.167 us  |          nand_do_write();
 0) ! 481.167 us  |        }
 0) ! 486.500 us  |      }
 0) ! 492.167 us  |    }
 0) ! 506.166 us  |  }
#

重启后磁盘文件写入正确。

Ftrace 的差异似乎约为inode,但我不确定是否可以调整!

所以当我尝试调整 UBIFS 文件写入时,我一定错过了一些重要的事情。

linux
  • 1 1 个回答
  • 17 Views

1 个回答

  • Voted
  1. Best Answer
    wangt13
    2023-09-14T17:09:54+08:002023-09-14T17:09:54+08:00

    我想我找到了可以立即将文件写入闪存的旋钮。

    我错过了下面刚刚定义的另一个参数dirty_writeback_interval,它是unsigned int dirty_expire_interval = 30 * 100; /* centiseconds */。

    通过将其设置为dirty_writeback_centisecs(1001秒),在文件写入后1秒重新启动系统可以使文件正确更新。

    我需要阅读有关这些参数的更多信息,到目前为止我仍然不清楚为什么dirty_expire_centisecs很重要,它是否会启动另一个计时器来刷新脏数据???

    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve