如何调试写时复制?
How to debug copy-on-write?
我们有一些 code 依赖于 fork
的广泛使用。我们开始遇到性能问题,我们的假设之一是,当在分叉进程中发生写时复制时,我们确实浪费了很多速度。
有没有办法专门检测复制和写入发生的时间和方式,以便详细了解这个过程。
我的平台是 OSX,但也欢迎提供更一般的信息。
有几种方法可以在 OS X 上获取此信息。如果您对 command-line 中有关 copy-on-write 行为的信息感到满意,您可以使用vm_stat
具有间隔的工具。例如,vm_stat 0.5
将每秒打印两次完整的统计信息。其中一列是 copy-on-write 故障的数量。
如果您想以更详细的方式收集特定信息,但仍然来自实际 运行 过程之外,您可以使用 OS X 附带的 Instruments 应用程序。这包括一组用于收集有关 运行 进程的信息的工具,其中对您的情况最有用的可能是 VM Tracker、Virtual Memory Trace 或 Shared Memory 工具。这些在流程的生命周期内捕获大量有用的信息。该应用程序不是非常直观,但它会满足您的需要。
如果您需要详细信息 in-process,我认为您需要使用(记录不完整的)VM 统计信息 API。您可以使用 host_statistics
例程请求内核填充 vm_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);
将用 cow_faults
等信息填充 vmstats
结构,它给出了 copy-on-write 行为触发的故障数。查看 headers /usr/include/mach/vm_*
,它声明了用于收集此信息的类型和例程。
我们有一些 code 依赖于 fork
的广泛使用。我们开始遇到性能问题,我们的假设之一是,当在分叉进程中发生写时复制时,我们确实浪费了很多速度。
有没有办法专门检测复制和写入发生的时间和方式,以便详细了解这个过程。
我的平台是 OSX,但也欢迎提供更一般的信息。
有几种方法可以在 OS X 上获取此信息。如果您对 command-line 中有关 copy-on-write 行为的信息感到满意,您可以使用vm_stat
具有间隔的工具。例如,vm_stat 0.5
将每秒打印两次完整的统计信息。其中一列是 copy-on-write 故障的数量。
如果您想以更详细的方式收集特定信息,但仍然来自实际 运行 过程之外,您可以使用 OS X 附带的 Instruments 应用程序。这包括一组用于收集有关 运行 进程的信息的工具,其中对您的情况最有用的可能是 VM Tracker、Virtual Memory Trace 或 Shared Memory 工具。这些在流程的生命周期内捕获大量有用的信息。该应用程序不是非常直观,但它会满足您的需要。
如果您需要详细信息 in-process,我认为您需要使用(记录不完整的)VM 统计信息 API。您可以使用 host_statistics
例程请求内核填充 vm_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);
将用 cow_faults
等信息填充 vmstats
结构,它给出了 copy-on-write 行为触发的故障数。查看 headers /usr/include/mach/vm_*
,它声明了用于收集此信息的类型和例程。