我正在用 C++ 构建一个从磁盘读取大量数据的服务器。使用 perf 录制时,我收到以下报告:
28.20% server [kernel.kallsyms] [k] copy_user_generic_string
18.14% server [kernel.kallsyms] [k] clear_page_rep
7.31% server server [.] SearchEngine::value_intersection<FullTextRecord>
5.64% server server [.] SearchEngine::value_intersection<DomainLinkFullTextRecord>
4.20% server libz.so.1.2.11 [.] inflate
1.63% server [kernel.kallsyms] [k] rmqueue
1.39% server server [.] SearchEngine::value_intersection<LinkFullTextRecord>
1.23% server [kernel.kallsyms] [k] page_fault
1.15% server [kernel.kallsyms] [k] native_queued_spin_lock_slowpath
1.04% server [kernel.kallsyms] [k] xas_load
0.87% server [kernel.kallsyms] [k] __pagevec_lru_add_fn
0.81% server [kernel.kallsyms] [k] find_get_entry
0.80% server libz.so.1.2.11 [.] crc32_z
0.65% server [kernel.kallsyms] [k] down_read_trylock
0.61% server [kernel.kallsyms] [k] workingset_activation
0.56% server [kernel.kallsyms] [k] iommu_map_page
0.51% server [kernel.kallsyms] [k] generic_file_buffered_read
0.50% server libc-2.31.so [.] __memmove_avx_unaligned_erms
有什么方法可以知道我的代码的哪部分导致了高 copy_user_generic_string 和 clear_page_rep?
尝试在线查找有关这两者的信息,但找不到任何好的文档。
答案1
clear_page_rep
是内核在将内存页处理给您的进程之前将其清零。这意味着您分配了大块内存。出于安全目的,这些内存会被清除,否则您可能会被处理包含来自其他进程甚至内核的数据的页面。
copy_user_generic_string
就是它所说的,你正在复制数据。