我们有一些code依赖于fork
的广泛使用。我们开始遇到性能问题,我们的一个假设是,当分叉进程中发生写入时,我们确实会浪费很多速度。
有没有办法专门检测复制和写入的发生时间和方式,以便详细了解此过程。
我的平台是OSX,但也欢迎更多的一般信息。
答案 0 :(得分:2)
有几种方法可以在OS X上获取此信息。如果您对从命令行中查看有关写时复制行为的信息感到满意,可以使用vm_stat
工具间隔。例如,vm_stat 0.5
将每秒打印两次完整的统计数据。其中一列是写时复制错误的数量。
如果您想以更详细的方式收集特定信息,但仍然来自实际运行过程之外,您可以使用OS X附带的Instruments应用程序。这包括一组用于收集有关信息的工具。运行过程,对您的情况最有用的可能是VM Tracker,虚拟内存跟踪或共享内存仪器。它们在流程的生命周期中捕获大量有用信息。该应用程序不是非常直观,但它可以满足您的需求。
如果您想要详细信息进程中,我认为您需要使用(记录不完整的)VM统计信息API。您可以使用vm_statistics
例程请求内核填充host_statistics
结构。例如,运行此代码:
mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
vm_statistics_data_t vmstats;
kern_return_t host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t) &vmstats, &count);
将使用vmstats
等信息填充cow_faults
结构,该信息给出了写时复制行为触发的故障数。查看标题/usr/include/mach/vm_*
,它标识了用于收集此信息的类型和例程。