如何模拟慢速DVD驱动器?

9

有没有人知道模拟缓慢DVD驱动器的可行方法,例如在挂载的DMG / ISO映像上?

目标是针对缓慢驱动器进行编程,因此需要模拟。任何想法都将不胜感激!

更新:再次强调,目标是模拟缓慢的I/O过程。像Network Conditioner或Charles这样的工具都无法提供解决方案。trickle已经过时,不再被积极开发 :(


2
第二句已经解释了。这个问题值得被踩吗?在我看来,这是一个完全合理的请求。像 Network Conditioner 或 Charles 这样的工具是存在的。 - Ain Tohvri
2
下降的投票是因为没有表现出努力或研究的迹象。我的关注点并没有被你的第二句话所解决。为什么你的代码依赖于特定的I/O吞吐量? - Daniel A. White
4
研究工作非常费力。如果有人真的提供了解决方案,我就不会在这里发帖子并坐等了!如果我已经找到解决方案,我也不会发帖子!难道你不能想象一种情况,即软件完全从可移动介质运行吗? - Ain Tohvri
2
@BrettHale 我正在尝试查看是否存在隐藏的问题,可以在不依赖磁盘速度的情况下解决。 - Daniel A. White
你也可以使用一种自制的库,通过流给出可配置的KB/s输出。你只需在库逻辑中调用wait函数,根据需要的KB/s数量获取流。当然,如果你要求的吞吐量超过了流本身的能力,它应该会通知你。 - AlexandruB
显示剩余4条评论
2个回答

4

使用hdiutil,您可以在一个特别制作的HTTP服务器上挂载磁盘映像,但是您无法控制操作系统缓存,而且I/O速度不够细致。我建议使用两个非网络解决方案。

在I/O系统调用中插入延迟

您可以通过DYLD_INSERT_LIBRARIES来减慢I/O系统调用的速度。这种方法非常简单,这也是我首先尝试的方法。

您只需创建一个包含read(2)pread(2)实现的库即可:

/* slow.c */
#define SLEEP_TIMESPEC {0, 25000000} // 25ms
ssize_t
read(int fildes, void *buf, size_t nbyte) {
    struct timespec s = SLEEP_TIMESPEC;
    (void) nanosleep(&s, NULL);
    return (ssize_t) syscall(SYS_read, fildes, buf, nbyte);
}

ssize_t
pread(int d, void *buf, size_t nbyte, off_t offset) {
    struct timespec s = SLEEP_TIMESPEC;
    (void) nanosleep(&s, NULL);
    return (ssize_t) syscall(SYS_pread, d, buf, nbyte, offset);
}

你可能还需要实现readv(2)。你只需要将此C代码编译为共享库,并设置DYLD_INSERT_LIBRARIES在运行程序之前加载此库。你可能还需要定义DYLD_FORCE_FLAT_NAMESPACE。请参见dyld(1)

clang -arch i386 -arch x86_64 -shared -Wall slow.c -o slow.dylib

(The library is compiled universally, as the AIR app I had on disk was actually i386, not x86_64).
为了测试该库,只需执行以下操作:
env DYLD_INSERT_LIBRARIES=slow.dylib DYLD_FORCE_FLAT_NAMESPACE=1 cat slow.c

您可能需要尝试使用高于25ms的值来设置cat,例如1秒,可以内联为{1, 0}。同样,您应该从命令行启动应用程序:

env DYLD_INSERT_LIBRARIES=slow.dylib DYLD_FORCE_FLAT_NAMESPACE=1 path/to/YourApp.app/Contents/MacOS/YourApp

这将减慢每个读取调用(即使通过更高级别的API)。某些读取操作不会受到影响(例如mmap(2)),但您可能希望放慢某些文件的I / O,而不是其他文件。后一种情况可以通过捕获open(2)来处理,但需要更多工作。
每个读取访问25毫秒足以使任何AIR应用程序明显变慢。当然,您应该根据自己的需求调整此值。
与较慢的文件系统一起工作
或者,您可以实现Fuse插件。如果您从LoopbackFS(CObjC)开始,这尤其容易。

事实上,您可以非常容易地在readFileAtPath:userData:buffer:size:offset:error:方法或loopback_read函数中调用nanosleep(2)


谢谢你的帖子,Paul。虽然我不是在那个低层次上工作,但我一定会去了解一下。再次感谢! - Ain Tohvri
1
DYLD_INSERT_LIBRARIES解决方案并不是那么底层。我详细说明了解决方案,因此您可以非常轻松地测试它。它适用于我在磁盘上拥有的虚拟AIR应用程序。 - Paul Guyot
如果有人感兴趣,功能代码现在也可以在https://github.com/ain/libsnailio找到。 - Ain Tohvri
问题在于它不幸的是行不通,因为该dylib会影响NetConnection与NetStream建立到本地存储的连接。http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetConnection.html - Ain Tohvri

2
首批DVD驱动器和播放器的读写速度为每秒1350 kB(或1.32 MB/s);这个速度通常被称为“1×”,是任何DVD驱动器中最慢的速度。USB 1.1闪存驱动器的名义速度为12Mbps(即1.5MB/s),实际速度非常接近1x DVD驱动器。因此,为什么不将图像复制到旧的USB 1.1闪存驱动器上,并从那里进行挂载呢?如果你没有,可以在eBay上找到二手的闪存驱动器。我还应该提到,像ADSL2或HSPA(3.5G)这样的宽带互联网连接的实际下载速度约为12Mbps,这正是你想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接