- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
下面的程序从一个文件中读入一堆行并解析它们。它可能会更快。另一方面,如果我有多个内核和多个文件要处理,那应该没什么大不了的;我可以并行运行作业。
不幸的是,这在我的 arch 机器上似乎不起作用。运行该程序的两个拷贝只比运行一个拷贝(见下文)快一点点(如果有的话),而且还不到我的驱动器能力的 20%。在具有相同硬件的 ubuntu 机器上,情况要好一些。我获得了 3-4 核的线性扩展,但我的 SSD 驱动器容量仍达到 50% 左右。
随着内核数量的增加,哪些障碍会阻碍 I/O 吞吐量的线性扩展?可以采取哪些措施来提高软件/操作系统方面的 I/O 并发性?
附言- 对于下面提到的硬件,单核速度足够快,如果我将解析移动到单独的线程,读取将受 I/O 限制。还有other optimizations用于提高单核性能。然而,对于这个问题,我想关注并发性以及我的编码和操作系统选择如何影响它。
详细信息:
这里有几行iostat -x 1
输出:
使用 dd 将文件复制到/dev/null:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 883.00 0.00 113024.00 0.00 256.00 1.80 2.04 2.04 0.00 1.13 100.00
运行我的程序:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 1.00 1.00 141.00 2.00 18176.00 12.00 254.38 0.17 1.08 0.71 27.00 0.96 13.70
同时运行我的程序的两个实例,读取不同的文件:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 11.00 0.00 139.00 0.00 19200.00 0.00 276.26 1.16 8.16 8.16 0.00 6.96 96.70
还好一点!添加更多内核不会增加吞吐量,实际上它开始降级并变得不那么一致。
这是我的程序的一个实例和 dd 的一个实例:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 9.00 0.00 468.00 0.00 61056.00 0.00 260.92 2.07 4.37 4.37 0.00 2.14 100.00
这是我的代码:
#include <string>
#include <boost/filesystem/path.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
typedef boost::filesystem::path path;
typedef boost::filesystem::ifstream ifstream;
int main(int argc, char ** argv) {
path p{std::string(argv[1])};
ifstream f(p);
std::string line;
std::vector<boost::iterator_range<std::string::iterator>> fields;
for (getline(f,line); !f.eof(); getline(f,line)) {
boost::split (fields, line, boost::is_any_of (","));
}
f.close();
return 0;
}
这是我编译它的方式:
g++ -std=c++14 -lboost_filesystem -o gah.o -c gah.cxx
g++ -std=c++14 -lboost_filesystem -lboost_system -lboost_iostreams -o gah gah.o
编辑:更多细节
我clear memory cache (free page cache, dentries and inodes)在运行上述基准测试之前,要防止 linux 从缓存中提取页面。
我的进程似乎受 CPU 限制;切换到 mmap 或通过 pubsetbuf 更改缓冲区大小对记录的吞吐量没有明显影响。
另一方面,缩放是 IO 绑定(bind)的。如果我在运行我的程序之前将所有文件放入内存缓存中,吞吐量(现在通过执行时间来衡量,因为 iostat
看不到它)与内核数量成线性比例。
我真正想了解的是,当我使用多个顺序读取进程从磁盘读取数据时,为什么吞吐量不随进程数线性增长,直到接近驱动器的最大读取速度?为什么我会在不使吞吐量饱和的情况下达到 I/O 限制,当我这样做时如何取决于我在其上运行的操作系统/软件堆栈?
最佳答案
你不是在比较相似的东西。
你在比较
Copying a file to /dev/dull with dd:
(我假设你的意思是 /dev/null
...)
与
int main(int argc, char ** argv) {
path p{std::string(argv[1])};
ifstream f(p);
std::string line;
std::vector<boost::iterator_range<std::string::iterator>> fields;
for (getline(f,line); !f.eof(); getline(f,line)) {
boost::split (fields, line, boost::is_any_of (","));
}
f.close();
return 0;
}
第一个只是读取原始字节而不关心它们是什么并将它们转储到位桶中。您的代码按行读取,需要识别,然后将它们拆分为 vector 。
您读取数据的方式是读取一行,然后花时间处理它。您比较代码的 dd
命令从不花时间做读取数据以外的事情 - 它不必读取然后处理然后读取然后处理...
关于c++ - 如何在 Linux 中提高 SSD I/O 吞吐量并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43722841/
我希望 Kubernetes 在我的 Google Kubernetes 引擎集群中使用本地 SSD,而不使用 alpha 功能。有办法做到这一点吗? 预先感谢您的任何建议或帮助。 最佳答案 http
我已经阅读了论文 MobileNetV2(arXiv:1801.04381) 并从 Tensorflow model zoo 运行模型. 我注意到 SSD Lite MobileNetV2 的推理
Kafka 速度很快,因为它在 HDD 上使用顺序写入技术。 如果我为 Kafka Brokers 使用 SSD,我能获得更快的性能吗? 据我所知,SSD 的工作方式与 HDD 不同。而且我认为使用
大多数 SQL 关系数据库都支持表中聚集索引的概念。聚簇索引通常作为 B 树实现,表示给定表中的实际记录,按磁盘/存储上的索引物理排序。这种特殊的聚簇索引的一个优点是,在遍历 B 树搜索一条记录或一组
目录 c:\test 里面有 50 个左右的文件,没有子目录。 If IO.Directory.Exists("C:\test") Then IO.Directory.Dele
我准备发布一个只对普通硬盘有效的工具,而不是 SSD(固态硬盘)。事实上,它不应该与 SSD 一起使用,因为它会导致大量读/写而没有实际效果。 任何人都知道检测给定驱动器是否为固态的方法? 最佳答案
鉴于固态硬盘 (SSD) 的价格正在下降,并且很快将作为系统驱动器变得更加普遍,并且鉴于它们的访问率明显高于旋转磁介质,哪些标准算法将通过使用用于本地存储的 SSD?例如,SSD 的高随机读取速度使得
SSD 现在很普遍; Amazon EBS 由 SSD 支持,因此大多数云数据库现在也运行在 SSD 上(Heroku PostgreSQL 等)。传统上,数据库和相关架构的设计理念是随机访问不好 -
为什么选择Windows 单击部署后,Vultr云业务流程将接管并在所需的数据中心中旋转实例。 Windows支持的云服务器 Windows Serv
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: Exploring the Benefit of Activation Sparsity in Pre-training
我已经用自定义数据集(电池)训练了 SSD Mobilenet 模型。下面给出了电池的示例图像,并附上了我用来训练模型的配置文件。 当物体靠近摄像头时(用网络摄像头测试),它以超过 的概率准确检测到物
我有一个应用程序,它每秒通过网络接收数百个字符串,大约 50 个字节长。我想将这些缓存到 SSD 以进行进一步处理。如果我每秒执行数百 ~50 字节的文件附加写入,SSD 是否安全?我怀疑操作系统可能
我需要创建一个 T 卷,T 已创建,但如果磁盘是 ssd,我还需要一个新的 U 卷,我该怎么做? 知道我是否是 SSD 的批处理命令是什么? [...] set /a VOL_SIZE= %MINSI
我想在自定义数据集上训练 Mobilenet SSD 模型。 我研究了重新训练模型的工作流程,并注意到配置文件中的 image_resizer{} 块: https://github.com/tens
我已经在 tensorflow 中尝试了 SSD 和 YOLO 实现。现在我想为我自己的数据集重新训练其中任何一个,比如交通信号。如何从 pascal voc 中重新训练 SSD 数据?有人可以帮忙吗
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 2 年前。 已锁定。这个问题
我正在开发一个应用程序,其中有大量数据不断写入 ram,我试图从 ram 中快速读取数据,并将其写入 NVMe SSD,写入完成后,我重新排队 ram允许它被写入的空间。 我目前的问题是数据无限期地连
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我确定的是: 我在 Linux 上使用 Java/Eclipse,并尝试在磁盘上分别存储大量 16/32 字节的键/值对。 key 是完全随机的,由 SecureRandom 生成。 速度恒定在约 5
我正在用 Rust 编写一个工具,它需要根据当前文件系统是 SSD 还是传统硬盘驱动器来改变其功能。 运行时的区别在于,如果文件存在于 SSD 上,与 HDD 相比,将使用更多线程来访问文件,这只会破
我是一名优秀的程序员,十分优秀!