如何监控程序的IO
How to monitor IO of a program
这个用c++编写的开源科学应用程序倾向于在短时间内生成大量小的写入(使用流)。我正在修改代码,这样IO就不会那么频繁了。
它实际上只打开/写入一两个文件。程序运行时监控IO频率的最佳方式是什么?或者监控某些文件的写入频率?
编辑:在我将所有的"endl"更改为"\n"之后,strace显示该程序正在用原始代码进行大量的"writev"操作,而不是"write"操作。这是strace输出比较。
之前:
write(4, "+n", 2) = 2
write(4, ">>=@ABCEDBCFBEACDDCDDCBBCCDDCFAC"..., 77) = 77
write(3, "@C3A7DACXX140502:1:1314:6663:801"..., 37) = 37
write(3, "CATCAAACAAGATATGGATGTAGAACGCTCAG"..., 77) = 77
write(3, "+n", 2) = 2
write(3, "?@>CCCDEDDFBDBCECCCEBAECCD@DDEDE"..., 77) = 77
write(4, "@C3A7DACXX140502:1:1314:6663:801"..., 37) = 37
write(4, "TTAGACAATGTAGTGAAATAGTTACTTTGGGG"..., 77) = 77
write(4, "+n", 2) = 2
write(4, "==:BABBCDFBCEBECABBBE@B?DCDBDDCC"..., 77) = 77
write(3, "@C3A7DACXX140502:1:1314:6664:692"..., 36) = 36
write(3, "CAAAGACAGGTATGGAGACAGGAGAAGGGAGC"..., 77) = 77
write(3, "+n", 2) = 2
write(3, ";=;3=6.?A'7*:;@AA=@@?C>.++68>),)"..., 77) = 77
write(4, "@C3A7DACXX140502:1:1314:6664:692"..., 36) = 36
write(4, "ACAAGATGTCTTCGGAGTTTCCGGGATAGCCA"..., 77) = 77
之后:
writev(3, [{"n@C3A7DACXX140502:3:1209:20544:1"..., 8186}, {"ACCTCCTCCTGCTTTCACCTATCCCGCTTCAC"..., 76}], 2) = 8262
writev(4, [{"n@C3A7DACXX140502:3:1209:20544:1"..., 8186}, {"GATCCTCGTCAGTCCTGAAGGAGTGTCAGCTT"..., 76}], 2) = 8262
writev(3, [{"n+nBA@CDEEEDEFEDBBDCDBDBCDCB@DDB"..., 8148}, {"??>ABEEECADDBBABBDCEBDCDCBECDBC@"..., 76}], 2) = 8224
writev(4, [{"n+n>>;ABCD@BEDFCDCDECCECCE?DADCE"..., 8148}, {">>;ABABBDDECEDECECCCECBBECCDDDFD"..., 76}], 2) = 8224
writev(3, [{"n@C3A7DACXX140502:3:1209:20618:6"..., 8184}, {"TTGGAAGGCCAGGTCCAGTAACCGGCCCCATT"..., 76}], 2) = 8260
writev(4, [{"n@C3A7DACXX140502:3:1209:20618:6"..., 8184}, {"ATTAGTAATTTCAGTGCCTCCTCCATCTTTAG"..., 76}], 2) = 8260
writev(3, [{"n+n?@>CCDFEEDDDCBDBDEBBCDB@CDBBB"..., 8148}, {"B@<DDDDFCEDEBBDDBDBDC@EBBECDDCEC"..., 76}], 2) = 8224
writev(4, [{"n+n>=;?C@?CBCCEDEAEDCDDBDDBDCDEB"..., 8148}, {">><A@BED@DDBDECBCBECCECDBDCDBEED"..., 76}], 2) = 8224
writev(3, [{"n@C3A7DACXX140502:3:1209:20684:3"..., 8180}, {"ACCCAAATGAGATCTGTGTGCCAATGTCAGTG"..., 76}], 2) = 8256
writev(4, [{"n@C3A7DACXX140502:3:1209:20684:3"..., 8180}, {"TCATCTGTGAACTCCACCAAGTTTTGTGCCTC"..., 76}], 2) = 8256
这是否意味着它正在写入缓冲区而不是刷新文件?
IO调优和性能改进既困难又耗时——您必须弄清楚应用程序的IO模式,并将代码和硬件与之匹配。甚至可以调整您的文件系统,甚至可以首先根据您的IO需求选择一个文件系统。这有点像阻抗匹配的电气组件,可以获得最佳性能——当你想在设计极限下驱动系统时,从应用程序代码到磁头本身,一切都很重要。
你不能在设计极限下驱动系统,同时因为C++IO层等软件抽象而忽略设计。。。
-
评测应用程序,以确定IO性能是否是瓶颈。如果它在IO方面没有瓶颈,那么改进IO对应用程序性能没有多大帮助。
-
在
strace
下运行应用程序,看看幕后发生了什么。应用程序是否进行了大量的seek()/lseek()
系统调用?这些会使C++运行库所做的任何缓冲失效,这将需要改进IO方法。 -
如果你发现你的应用程序需要提高它的IO性能,你可能需要在不使用C++IO例程的情况下重做IO——它们不快。请参阅此处:std::fstream缓冲与手动缓冲(为什么手动缓冲会增加10倍)?。
-
如果你只是在读/写大流而根本不进行搜索,并且在数据从缓存中清除之前没有重新读取数据,那么内核页面缓存只会让你慢下来。使用较低级别的基于C的IO例程,使用页面对齐内存来读取/写入数据,并在打开时使用O_DIRECT标志来执行直接IO并绕过内核页面缓存。
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- Agora.io 虚幻引擎插件构建错误
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- C++中真正的异步文件 IO
- 在C++中返回 IO 对象的目的是什么?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- C++网络 IO、文件处理和网络故障
- Xcode OSX上的C++构建失败,出现多个错误文件IO..不可用:在macOS 10.15中引入
- Android Studio-在现有的旧项目中启用本机C++调试(card.io Android Source)
- 如何检测函数是否执行IO操作
- 如何键入用于const对象的自定义io操纵器
- libevent是否允许在不同的线程中运行timer/io的回调
- 如何监控程序的IO