用systemtap分析磁盘写入操作

摘要:
为了解决这个问题,我编写了一个简单的systemtap脚本来分析文件编写操作(“stap.log”){printf;}}输出结果让我很惊讶:name=do_sync_writepid=22542uid=0ino=324338name=sda1filename=sqlite_lVkvYHYHUTVO2SS journalname=do_ssync_writepid=22542uid=0ino=324338name=sda1filename=sqlite_lvkvYHUTVO2S journalname=sda_1sync_writepid=225442uid=0ino=324338name=sda1file name=sqlite_1VkvYHUTvo2SS johannalname=do_sync_writepid=22542uid=20ino=324338 name=sda1file name=sqlite_1lVkvYHYHUTVO2SS日志名称=do_sync_writepid=22542uid=0ino=324338name=sda1filename=sqlite_lVkvYHUTVO2S日志名称=do _sync_wwritepid=22542 uid=0ino=324316name=sda1file名称=sqlite_lvkvYHYHVOVO2SSname=do_ssync_writepid=22542uid=0ino=324316name=sda1filename名称=sqlite _ lVkvyYHUTVO2sSname=do_sync-writepid=42542uid=0ino=324316name=sda1file文件名=sqlite_1VkvYHVO2SSname _ lVkvYHYHUTVO2SSname=do_同步_writepid=22542uid=0ino=324316name=sda1filename=sqlite_ lVkvYHYHUTVO2SSname=do_sync_ writepid=22542uid=0ino=324316name=sda1filename=sqlite_ LVkvYHUTVO2S实际上是一个sqlite,它执行了许多临时文件写入操作。它一启动就完成了800多次写入操作。添加记录需要24次写入,包括21次临时文件写入。当我检查sqlite进程打开的文件时,我发现临时文件放在/var/tmp下。这就是问题所在。这不是临时文件系统。我修改了sqlite代码,闪存写入操作减少到原来的1/8。

用systemtap分析磁盘写入操作

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>


这几天发现有好几块broncho开发板的FLASH坏了,broncho使用的SLC,现在的SLC写入寿命至少在10W次以上,尽管现在的测试要比正常使用高得多,也没有可能在不到一个月就坏了啊。不过最近听人说jffs2的磨损均衡只是在剩余空间中进行,而broncho的剩余空间并不多,这让我觉得事态有些严重。

得做点什么才行。我先想到的是文件操作可能存在问题,没有多少地方需要进行写入操作啊,即使均衡不好,flash也不应该坏得这么快啊。为了揭开这个谜底,我写了个简单的systemtap脚本,用来分析文件写入操作。

  1. probe kernel.function("do_sync_write")
  2. {
  3.     name="do_sync_write";
  4.     dev = __file_dev($filp)
  5.     devname = __find_bdevname(dev, __file_bdev($filp))
  6.     ino = __file_ino($filp)
  7.     filename = __file_filename($filp);
  8.  
  9.     if((uid()==0 || uid()== 503) && !isinstr(filename, "[") && filename != "stap.log")
  10.     {
  11.         printf("name=%s pid=%d uid=%d ino=%d name=%s filename=%s/n", name, pid(), uid(), ino, devname, filename);
  12.     }
  13. }

 
输出结果让我有些意外:

  1. name=do_sync_write pid=22542 uid=0 ino=324338 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS-journal
  2. name=do_sync_write pid=22542 uid=0 ino=324338 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS-journal
  3. name=do_sync_write pid=22542 uid=0 ino=324338 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS-journal
  4. name=do_sync_write pid=22542 uid=0 ino=324338 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS-journal
  5. name=do_sync_write pid=22542 uid=0 ino=324338 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS-journal
  6. name=do_sync_write pid=22542 uid=0 ino=324316 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS
  7. name=do_sync_write pid=22542 uid=0 ino=324316 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS
  8. name=do_sync_write pid=22542 uid=0 ino=324316 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS
  9. name=do_sync_write pid=22542 uid=0 ino=324316 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS
  10. name=do_sync_write pid=22542 uid=0 ino=324316 name=sda1 filename=sqlite_lVkvYHYHUTVO2SS


居然是sqlite做了大量的临时文件写入操作,仅仅是起动一次就做了800多次写入操作。增加一条记录要写入24次,其中临时文件写入占21次。如果使用的临时文件系统,那没事儿,因为临时文件系统是用内存来模拟的,写多少次都不怕,默认的临时文件系统mount在/tmp下。而我在检查sqlite进程打开的文件时,发现临时文件放在/var/tmp下,问题就出在这里,这不是临时文件系统。我修改了sqlite的代码,对flash的写入操作降为原来的1/8。

希望这个改动确实有效。

~~end~~


免责声明:文章转载自《用systemtap分析磁盘写入操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇有道词典中的OCR功能:第三方库的变化深入剖析 RocketMQ 源码 消息存储模块下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Sqlite数据库完整性检测

/************************************************************************************************* * 函数名称: IntegrityCheck * 功能描述: 数据库完整性检测 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 0:完整...

java使用jdbc对sqlite 添加、删除、修改的操作

package com.jb.jubmis.Dao.DaoImpl; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import...

Qt-数据库操作SQLite

1  简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=88 说明:本文对在Qt中操作SQLite做简要说明。 SQLite:SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。具体的操作命令可参考:https://www.runoob.com/sqli...

SQLite 如何设置自增字段

SQLite 如何设置自增字段 转自:https://www.wenjiangs.com/article/sqlite-autoincrement-key.html 使用数据库的程序员都知道,一个表需要一个或多个主键,避免和其它表的数据冲突,更好的索引表数据。主键一般都是自动增长的,并且会自动创建索引。 什么是主键? 主键是表中经常有一个列或列的组合,其值...

Sqlite数据库字符串处理函数replace

Sqlite 字符串处理函数replace官方说明: replace(X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. The BINARY...

[NewLife.XCode]百亿级性能

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。 开源地址:https://github.com/NewLifeX/X(求s...