如何模拟慢速DVD驱动器?

时间:2014-07-07 14:42:39

标签: macos performance-testing iso dmg dvd

有没有人知道模拟慢速DVD驱动器的任何可行方法,例如:通过安装的DMG / ISO映像?

目标是针对慢速驱动进行编程,从而满足模拟要求。任何想法将不胜感激!

更新:再次,目标是模拟缓慢的I / O流程。不幸的是,Network Conditioner或Charles等工具无法提供解决方案。涓涓细流已经过时,不再积极发展:(

2 个答案:

答案 0 :(得分:4)

使用hdiutil,您可以在特制的HTTP服务器上安装磁盘映像,但是您不能控制操作系统缓存,并且I / O速度不会很细。我建议使用两种非网络解决方案。

在I / O系统调用中插入缓慢

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

您只需创建一个包含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

(这个库是普遍编译的,因为我在磁盘上的AIR应用程序实际上是i386,而不是x86_64。)

要测试库,只需执行以下操作:

env DYLD_INSERT_LIBRARIES=slow.dylib DYLD_FORCE_FLAT_NAMESPACE=1 cat slow.c

您可能希望cat尝试使用高于25毫秒的值,例如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速度,但不会减慢其他文件的I / O.后一种情况可以通过捕获open(2)来处理,但需要更多的工作。

每次读取访问25毫秒足以使任何AIR应用程序明显变慢。当然,您应该根据需要调整此值。

使用较慢的文件系统

或者,您可以实现一个Fuse插件。如果从LoopbackFS(CObjC)开始,这一点尤为简单。

事实上,您可以在readFileAtPath:userData:buffer:size:offset:error:方法或loopback_read函数中轻松拨打nanosleep(2)

答案 1 :(得分:2)

第一个DVD驱动器和播放器的读写速度为of 1350 kB/sor 1,32 MB/s);此速度通常称为“1×”,是您在任何DVD驱动器中都能找到的最慢速度。

USB 1.1闪存驱动器有nominal speed of 12Mbps1,5MB/s,实际速度非常接近1倍DVD驱动器。

那么为什么不将图像复制到旧的USB 1.1闪存驱动器并从那里安装呢?如果你没有,你可以在易趣中找到旧的。

我还应该提到ADSL2或HSPA(3.5G)等宽带互联网连接的实际下载速度约为12Mbps,这就是你想要的。