有没有人知道模拟缓慢DVD驱动器的可行方法,例如在挂载的DMG / ISO映像上?
目标是针对缓慢驱动器进行编程,因此需要模拟。任何想法都将不胜感激!
更新:再次强调,目标是模拟缓慢的I/O过程。像Network Conditioner或Charles这样的工具都无法提供解决方案。trickle已经过时,不再被积极开发 :(
有没有人知道模拟缓慢DVD驱动器的可行方法,例如在挂载的DMG / ISO映像上?
目标是针对缓慢驱动器进行编程,因此需要模拟。任何想法都将不胜感激!
更新:再次强调,目标是模拟缓慢的I/O过程。像Network Conditioner或Charles这样的工具都无法提供解决方案。trickle已经过时,不再被积极开发 :(
使用hdiutil,您可以在一个特别制作的HTTP服务器上挂载磁盘映像,但是您无法控制操作系统缓存,而且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
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
mmap(2)
),但您可能希望放慢某些文件的I / O,而不是其他文件。后一种情况可以通过捕获open(2)
来处理,但需要更多工作。事实上,您可以非常容易地在readFileAtPath:userData:buffer:size:offset:error:
方法或loopback_read
函数中调用nanosleep(2)
。
DYLD_INSERT_LIBRARIES
解决方案并不是那么底层。我详细说明了解决方案,因此您可以非常轻松地测试它。它适用于我在磁盘上拥有的虚拟AIR应用程序。 - Paul Guyot