linux 읽기 호출 분석, 제2부분
52781 단어 yugabytepostgresperformancelinux
물리적 장치에서 실제 IO를 실행하기 전에 IO 호출(pread64())은 사용자 영역에서 여러 층을 뛰어넘어야 한다는 것이 본질이다.이전 글은 linux 페이지 캐시에서 서비스를 제공하는 읽기 호출의 실행 절차를 설명합니다.
이 부분에서는 실제 물리적 사건이 발생할 때 어떤 일이 일어날지 탐구할 것이다.이를 위해, 우리는pread에서 생성한 실행 가능한 파일을 사용합니다.c 지난 게시물에서 왔어요.
ftrace를 설정하고 pread를 실행합니다.
pread 실행 가능한 파일이 실제 물리 IO를 실행하도록 하려면 페이지 캐시에서 삭제해야 합니다.proc 파일 시스템의 drop caches 파일
/proc/sys/vm/drop_caches
을 사용하여 이 작업을 수행할 수 있습니다.분명히 이것은 'tt' 파일의 페이지를 삭제할 뿐만 아니라 현재 사용되지 않은 다른 캐시 페이지도 삭제합니다.이것은 바쁜 서버에서 이 동작을 실행하는 것이 좋은 생각이 아니라는 것을 의미한다.우선 ftrace를 설정합니다.나는 이 문장의 ftrace 부분을 완전한 방식으로 완성하고 있다.
무결성을 고려하여 ftrace를 닫으십시오.
echo 0 > tracing_on
현재 추적기를 함수 맵으로 설정하려면:echo function_graph > current_tracer
pread64 시스템 호출에 대한 추적 사용:echo ksys_pread64 > set_graph_function
추적 주석: 추적에 프로그램 실행 가능한 파일 이름과pid (funcgraph proc) 를 추가하고, 끝에 함수 이름 (funcgraph tail) 을 추가합니다.echo funcgraph-tail > trace_options
echo funcgraph-proc > trace_options
페이지 캐시를 새로 고치려면 다음과 같이 하십시오.echo 1 > /proc/sys/vm/drop_caches
추적 열기echo 1 > tracing_on
이제 다른 세션으로 이동하여 pread 를 실행합니다../pread
called pread( 3, c, 10). returned that 2 bytes were read.
Those bytes are as follows: x
추적 해제:echo 0 > tracing_on
결과는 아래의 전체 물리적 IO 추적에서 확인할 수 있지만 매우 깁니다.그래서 나는 가독성을 위해 몇 부분을 보여 주었다.시스템 호출의 시작은 이전 블로그에서 추적한 pread64 호출의 시작과 같습니다.
3) pr-5848 | | ksys_pread64() {
3) pr-5848 | | __fdget() {
...
3) pr-5848 | | pagecache_get_page() {
3) pr-5848 | 0.115 us | find_get_entry();
3) pr-5848 | 0.463 us | } /* pagecache_get_page */
3) pr-5848 | | page_cache_sync_readahead() {
마지막 행(page cache sync readahead()은 페이지cache get page()에서 페이지 캐시에서 페이지를 찾을 수 없는 경우에만 호출되는 함수입니다.이것이 바로 핵이 디스크에서 페이지를 읽기 시작하는 곳이다.함수generic_file_buffer_read()는 바로 이런 상황이 발생한 곳이다.다음은 다음과 같습니다.
다음 함수는 read pages()입니다.read pages() 함수는 함수 blk start plug()를 사용하여 IO 장치 대기열 "plug"개념을 사용합니다.이것은 욕조의 플러그인과 매우 비슷하지만, 현재는 IO 요청에 사용됩니다. IO 요청 목록을 삽입한 다음 함수가 지정한 페이지 목록에 따라 하나하나 IO 요청을 생성합니다. 목록이 완성되면 IO 스케줄러가 실행됩니다.이런 일괄 처리를 통해 IO 스케줄러가 IO 요청을 평가할 수 있고, 요청 순서가 틀리면 요청을 다시 정렬할 수 있으며, 요청한 블록 범위가 인접하면 IO 요청을 병합할 수 있다.
그런 다음 xfs vm readpages()>iomap readpages()를 호출합니다.이 함수는 IOmap을 생성합니다. 나중에 장치에 IO 요청을 제출하는 데 사용됩니다.
iomap readpages() 내부에서 먼저 iomap apply()를 호출합니다.이 함수는 요청된 페이지를 포함하는 iomap을 만드는 데 사용됩니다.함수 xfs read iomap begin () 은 iomap 생성을 요청하기 위한 시작입니다. xfs 블록 맵을 읽으려면 inode를 잠가야 합니다.함수 iomap readpages actor()는 iomap에 페이지를 추가하는 데 사용되는 반복 함수입니다.
iomap readpages()의 다음 함수이자 마지막 함수는submit bio()입니다.이 함수는 iomap을 가져와 블록 장치 층에 요청을 제출합니다.현재 장치 대기열이 막혀 있음을 주의하십시오.IO 스케줄러가 elv merge() 등의 기능을 사용하는 것을 볼 수 있습니다.
이 때 IO는 스케줄러 분산 - 집합 목록에 배치되지만 삽입된 상태입니다.현재 입출력 요청이 디바이스에 전송되지 않았습니다.xfs vm readpages()에서 돌아가면 iomap을 저장한 페이지가 해제됩니다.
blk finish plug()를 수행합니다.이 기능의 목적은 명백합니다. 장치의 요청 목록에 대한 차단을 해제하고 이 요청을 물리 장치에 제출합니다.이 함수에서 요청이 제출되었습니다.
여기의 주요 실제 기능은 하드웨어에 달려 있으며, 나의 예에서 blk mq do dispatch sched () 함수는 주로 장치에 요청을 보내는 것을 책임진다.
모든 예약된 요청을 제출하면 blk finish plug() 함수가 완료됩니다.
IOS가 커밋되었으므로 세션을 사용할 수 있을 때까지 기다려야 합니다.IO 호출을 동기화하는 이런 방식은 많은 운영체제에서 흔히 볼 수 있다. IO 요청이 물리 장치에 제출되면 프로세스는 CPU 밖에서 자신을 스케줄링하고 물리 장치가 보내는 중단을 기다리며 IO 요청이 완료되었음을 표시한다.따라서 io schedule()을 호출하고 schedule()를 호출합니다.프로세스는 상태 "D"(중단 없는 수면) 에서 CPU에서 벗어날 수 있도록 스케줄링되며, 중단된 상태에서만 깨어날 수 있습니다.그것은 심지어 살해당할 수 없다(신호 9;살해-9).
프로세스가 D 상태인 것은 흔치 않습니다.원인은 네가 생각하는 그런 것이 아닐 수도 있다.요청을 보내는 작업은'R'(실행 중) 상태에서 이루어지는데, 이는'top'등 유틸리티에서 볼 수 있기 때문이다.작업이 완료된 후에만 작업에 상태 "D"가 부여되고 CPU 외부에서 스케줄링됩니다.대부분의 도구는 CPU에 프로세스/작업을 표시하고 작업 상태가'D'인 작업은 매우 짧다.대부분의 시간이 CPU에서 벗어난 'D' 상태이기 때문에 'top' 같은 도구는 보이지 않는다.
3) pr-5848 | 0.142 us | copy_fpregs_to_fpstate();
3) pr-5848 | 0.156 us | finish_task_switch();
3) pr-5848 | ! 465.876 us | } /* schedule */
3) pr-5848 | ! 466.622 us | } /* io_schedule */
3) pr-5848 | 0.053 us | finish_wait();
블록 장치는 어느 시점에 요청 처리가 완료된 시스템에 중단을 통해 신호를 보냅니다.이렇게 하면 CPU 외부에 배치된 프로세스가 입출력 요청을 기다리게 됩니다.위의 실행 세션에서 schedule 함수를 되돌려주면 이 점을 볼 수 있습니다.
돌아오면 요청한 페이지가 캐시에 있고 페이지cace get page () 함수로 접근하고,inode 잠금 해제 (xfs iunlock ()) 를 사용한 다음 호출을 되돌려줍니다.
전체 함수 호출 흐름을 보려면 다음 문장을 참고하십시오.
전체 물리적 입출력 추적
3) pr-5848 | | ksys_pread64() {
3) pr-5848 | | __fdget() {
3) pr-5848 | 0.087 us | __fget_light();
3) pr-5848 | 0.561 us | } /* __fdget */
3) pr-5848 | | vfs_read() {
3) pr-5848 | | rw_verify_area() {
3) pr-5848 | | security_file_permission() {
3) pr-5848 | | selinux_file_permission() {
3) pr-5848 | | __inode_security_revalidate() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.040 us | rcu_all_qs();
3) pr-5848 | 0.352 us | } /* _cond_resched */
3) pr-5848 | 0.670 us | } /* __inode_security_revalidate */
3) pr-5848 | 0.040 us | avc_policy_seqno();
3) pr-5848 | 1.333 us | } /* selinux_file_permission */
3) pr-5848 | 0.040 us | bpf_lsm_file_permission();
3) pr-5848 | 0.041 us | __fsnotify_parent();
3) pr-5848 | 0.046 us | fsnotify();
3) pr-5848 | 2.710 us | } /* security_file_permission */
3) pr-5848 | 3.043 us | } /* rw_verify_area */
3) pr-5848 | | __vfs_read() {
3) pr-5848 | | new_sync_read() {
3) pr-5848 | | xfs_file_read_iter [xfs]() {
3) pr-5848 | | xfs_file_buffered_aio_read [xfs]() {
3) pr-5848 | | xfs_ilock [xfs]() {
3) pr-5848 | | down_read() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.039 us | rcu_all_qs();
3) pr-5848 | 0.353 us | } /* _cond_resched */
3) pr-5848 | 0.666 us | } /* down_read */
3) pr-5848 | 1.004 us | } /* xfs_ilock [xfs] */
3) pr-5848 | | generic_file_read_iter() {
3) pr-5848 | | generic_file_buffered_read() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.040 us | rcu_all_qs();
3) pr-5848 | 0.352 us | } /* _cond_resched */
3) pr-5848 | | pagecache_get_page() {
3) pr-5848 | 0.115 us | find_get_entry();
3) pr-5848 | 0.463 us | } /* pagecache_get_page */
3) pr-5848 | | page_cache_sync_readahead() {
3) pr-5848 | 0.040 us | kthread_blkcg();
3) pr-5848 | | ondemand_readahead() {
3) pr-5848 | | __do_page_cache_readahead() {
3) pr-5848 | | __page_cache_alloc() {
3) pr-5848 | | alloc_pages_current() {
3) pr-5848 | 0.059 us | get_task_policy.part.34();
3) pr-5848 | 0.039 us | policy_nodemask();
3) pr-5848 | 0.040 us | policy_node();
3) pr-5848 | | __alloc_pages_nodemask() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.040 us | rcu_all_qs();
3) pr-5848 | 0.356 us | } /* _cond_resched */
3) pr-5848 | 0.041 us | should_fail_alloc_page();
3) pr-5848 | | get_page_from_freelist() {
3) pr-5848 | 0.043 us | __inc_numa_state();
3) pr-5848 | 0.042 us | __inc_numa_state();
3) pr-5848 | 0.055 us | prep_new_page();
3) pr-5848 | 1.142 us | } /* get_page_from_freelist */
3) pr-5848 | 2.429 us | } /* __alloc_pages_nodemask */
3) pr-5848 | 3.741 us | } /* alloc_pages_current */
3) pr-5848 | 4.057 us | } /* __page_cache_alloc */
3) pr-5848 | | read_pages() {
3) pr-5848 | 0.056 us | blk_start_plug();
3) pr-5848 | | xfs_vm_readpages [xfs]() {
3) pr-5848 | | iomap_readpages() {
3) pr-5848 | | iomap_apply() {
3) pr-5848 | | xfs_read_iomap_begin [xfs]() {
3) pr-5848 | | xfs_ilock_for_iomap [xfs]() {
3) pr-5848 | | xfs_ilock [xfs]() {
3) pr-5848 | | down_read() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.040 us | rcu_all_qs();
3) pr-5848 | 0.354 us | } /* _cond_resched */
3) pr-5848 | 0.722 us | } /* down_read */
3) pr-5848 | 1.054 us | } /* xfs_ilock [xfs] */
3) pr-5848 | 1.425 us | } /* xfs_ilock_for_iomap [xfs] */
3) pr-5848 | | xfs_bmapi_read [xfs]() {
3) pr-5848 | 0.191 us | xfs_iext_lookup_extent [xfs]();
3) pr-5848 | 0.043 us | xfs_bmapi_trim_map.isra.16 [xfs]();
3) pr-5848 | 0.053 us | xfs_bmapi_update_map.isra.17 [xfs]();
3) pr-5848 | 1.260 us | } /* xfs_bmapi_read [xfs] */
3) pr-5848 | | xfs_iunlock [xfs]() {
3) pr-5848 | 0.040 us | up_read();
3) pr-5848 | 0.382 us | } /* xfs_iunlock [xfs] */
3) pr-5848 | | xfs_bmbt_to_iomap [xfs]() {
3) pr-5848 | 0.040 us | xfs_fsb_to_db [xfs]();
3) pr-5848 | 0.488 us | } /* xfs_bmbt_to_iomap [xfs] */
3) pr-5848 | 4.786 us | } /* xfs_read_iomap_begin [xfs] */
3) pr-5848 | | iomap_readpages_actor() {
3) pr-5848 | | add_to_page_cache_lru() {
3) pr-5848 | | __add_to_page_cache_locked() {
3) pr-5848 | 0.050 us | PageHuge();
3) pr-5848 | 0.038 us | shmem_mapping();
3) pr-5848 | | mem_cgroup_charge() {
3) pr-5848 | 0.051 us | get_mem_cgroup_from_mm();
3) pr-5848 | 0.061 us | try_charge();
3) pr-5848 | | mem_cgroup_charge_statistics.isra.74() {
3) pr-5848 | 0.040 us | __count_memcg_events.part.73();
3) pr-5848 | 0.354 us | } /* mem_cgroup_charge_statistics.isra.74 */
3) pr-5848 | 0.040 us | memcg_check_events();
3) pr-5848 | 1.673 us | } /* mem_cgroup_charge */
3) pr-5848 | 0.042 us | _raw_spin_lock_irq();
3) pr-5848 | | __mod_lruvec_page_state() {
3) pr-5848 | | __mod_lruvec_state() {
3) pr-5848 | 0.042 us | __mod_node_page_state();
3) pr-5848 | | __mod_memcg_lruvec_state() {
3) pr-5848 | 0.054 us | __mod_memcg_state.part.71();
3) pr-5848 | 0.399 us | } /* __mod_memcg_lruvec_state */
3) pr-5848 | 1.024 us | } /* __mod_lruvec_state */
3) pr-5848 | 1.361 us | } /* __mod_lruvec_page_state */
3) pr-5848 | 5.755 us | } /* __add_to_page_cache_locked */
3) pr-5848 | 0.040 us | lru_cache_add();
3) pr-5848 | 6.446 us | } /* add_to_page_cache_lru */
3) pr-5848 | | iomap_readpage_actor() {
3) pr-5848 | 0.040 us | iomap_page_create();
3) pr-5848 | 0.064 us | iomap_adjust_read_range();
3) pr-5848 | | bio_alloc_bioset() {
3) pr-5848 | | mempool_alloc() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.039 us | rcu_all_qs();
3) pr-5848 | 0.352 us | } /* _cond_resched */
3) pr-5848 | | mempool_alloc_slab() {
3) pr-5848 | | kmem_cache_alloc() {
3) pr-5848 | 0.040 us | should_failslab();
3) pr-5848 | 0.501 us | } /* kmem_cache_alloc */
3) pr-5848 | 0.826 us | } /* mempool_alloc_slab */
3) pr-5848 | 1.827 us | } /* mempool_alloc */
3) pr-5848 | 0.052 us | bio_init();
3) pr-5848 | 2.578 us | } /* bio_alloc_bioset */
3) pr-5848 | | bio_associate_blkg() {
3) pr-5848 | 0.042 us | kthread_blkcg();
3) pr-5848 | 0.276 us | bio_associate_blkg_from_css();
3) pr-5848 | 0.932 us | } /* bio_associate_blkg */
3) pr-5848 | 0.040 us | __bio_add_page();
3) pr-5848 | 5.267 us | } /* iomap_readpage_actor */
3) pr-5848 | + 12.394 us | } /* iomap_readpages_actor */
3) pr-5848 | + 17.914 us | } /* iomap_apply */
3) pr-5848 | | submit_bio() {
3) pr-5848 | | generic_make_request() {
3) pr-5848 | | generic_make_request_checks() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.039 us | rcu_all_qs();
3) pr-5848 | 0.350 us | } /* _cond_resched */
3) pr-5848 | 0.040 us | should_fail_bio();
3) pr-5848 | 0.185 us | blk_throtl_bio();
3) pr-5848 | 0.042 us | blk_cgroup_bio_start();
3) pr-5848 | 0.133 us | ktime_get();
3) pr-5848 | 2.376 us | } /* generic_make_request_checks */
3) pr-5848 | 0.090 us | blk_queue_enter();
3) pr-5848 | | dm_make_request [dm_mod]() {
3) pr-5848 | 0.100 us | __srcu_read_lock();
3) pr-5848 | | bio_alloc_bioset() {
3) pr-5848 | | mempool_alloc() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.039 us | rcu_all_qs();
3) pr-5848 | 0.352 us | } /* _cond_resched */
3) pr-5848 | | mempool_alloc_slab() {
3) pr-5848 | | kmem_cache_alloc() {
3) pr-5848 | 0.042 us | should_failslab();
3) pr-5848 | 0.485 us | } /* kmem_cache_alloc */
3) pr-5848 | 0.807 us | } /* mempool_alloc_slab */
3) pr-5848 | 1.776 us | } /* mempool_alloc */
3) pr-5848 | 0.052 us | bio_init();
3) pr-5848 | 2.458 us | } /* bio_alloc_bioset */
3) pr-5848 | | disk_start_io_acct() {
3) pr-5848 | | __part_start_io_acct() {
3) pr-5848 | 0.048 us | update_io_ticks();
3) pr-5848 | 0.410 us | } /* __part_start_io_acct */
3) pr-5848 | 0.734 us | } /* disk_start_io_acct */
3) pr-5848 | | __split_and_process_non_flush [dm_mod]() {
3) pr-5848 | 0.190 us | dm_table_find_target [dm_mod]();
3) pr-5848 | 0.050 us | max_io_len [dm_mod]();
3) pr-5848 | 0.043 us | alloc_tio.isra.38 [dm_mod]();
3) pr-5848 | | __bio_clone_fast() {
3) pr-5848 | 0.052 us | bio_clone_blkg_association();
3) pr-5848 | 0.066 us | ktime_get();
3) pr-5848 | 1.157 us | } /* __bio_clone_fast */
3) pr-5848 | 0.057 us | bio_advance();
3) pr-5848 | | __map_bio [dm_mod]() {
3) pr-5848 | | linear_map [dm_mod]() {
3) pr-5848 | | bio_associate_blkg() {
3) pr-5848 | 0.295 us | bio_associate_blkg_from_css();
3) pr-5848 | 0.612 us | } /* bio_associate_blkg */
3) pr-5848 | 1.074 us | } /* linear_map [dm_mod] */
3) pr-5848 | | generic_make_request() {
3) pr-5848 | | generic_make_request_checks() {
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.039 us | rcu_all_qs();
3) pr-5848 | 0.362 us | } /* _cond_resched */
3) pr-5848 | 0.040 us | should_fail_bio();
3) pr-5848 | 0.098 us | __disk_get_part();
3) pr-5848 | 0.147 us | blk_throtl_bio();
3) pr-5848 | 0.061 us | blk_cgroup_bio_start();
3) pr-5848 | 0.062 us | ktime_get();
3) pr-5848 | 2.593 us | } /* generic_make_request_checks */
3) pr-5848 | 2.952 us | } /* generic_make_request */
3) pr-5848 | 4.743 us | } /* __map_bio [dm_mod] */
3) pr-5848 | 8.124 us | } /* __split_and_process_non_flush [dm_mod] */
3) pr-5848 | 0.040 us | errno_to_blk_status();
3) pr-5848 | 0.063 us | dec_pending [dm_mod]();
3) pr-5848 | 0.041 us | __srcu_read_unlock();
3) pr-5848 | + 13.730 us | } /* dm_make_request [dm_mod] */
3) pr-5848 | 0.046 us | blk_queue_enter();
3) pr-5848 | | blk_mq_make_request() {
3) pr-5848 | 0.050 us | blk_queue_bounce();
3) pr-5848 | 0.125 us | blk_queue_split();
3) pr-5848 | 0.066 us | bio_integrity_prep();
3) pr-5848 | 0.055 us | blk_attempt_plug_merge();
3) pr-5848 | | __blk_mq_sched_bio_merge() {
3) pr-5848 | | dd_bio_merge() {
3) pr-5848 | 0.099 us | _raw_spin_lock();
3) pr-5848 | | blk_mq_sched_try_merge() {
3) pr-5848 | | elv_merge() {
3) pr-5848 | 0.039 us | elv_rqhash_find();
3) pr-5848 | | dd_request_merge() {
3) pr-5848 | 0.040 us | elv_rb_find();
3) pr-5848 | 0.386 us | } /* dd_request_merge */
3) pr-5848 | 1.092 us | } /* elv_merge */
3) pr-5848 | 1.448 us | } /* blk_mq_sched_try_merge */
3) pr-5848 | 2.223 us | } /* dd_bio_merge */
3) pr-5848 | 2.672 us | } /* __blk_mq_sched_bio_merge */
3) pr-5848 | | __rq_qos_throttle() {
3) pr-5848 | | wbt_wait() {
3) pr-5848 | 0.052 us | bio_to_wbt_flags.isra.20.part.21();
3) pr-5848 | 0.400 us | } /* wbt_wait */
3) pr-5848 | 0.040 us | blkcg_iolatency_throttle();
3) pr-5848 | 1.289 us | } /* __rq_qos_throttle */
3) pr-5848 | | __blk_mq_alloc_request() {
3) pr-5848 | | blk_mq_get_tag() {
3) pr-5848 | 0.211 us | __blk_mq_get_tag();
3) pr-5848 | 0.560 us | } /* blk_mq_get_tag */
3) pr-5848 | | blk_mq_rq_ctx_init.isra.46() {
3) pr-5848 | 0.066 us | ktime_get();
3) pr-5848 | 0.039 us | dd_prepare_request();
3) pr-5848 | 0.881 us | } /* blk_mq_rq_ctx_init.isra.46 */
3) pr-5848 | 2.098 us | } /* __blk_mq_alloc_request */
3) pr-5848 | | __rq_qos_track() {
3) pr-5848 | | wbt_track() {
3) pr-5848 | 0.039 us | bio_to_wbt_flags.isra.20.part.21();
3) pr-5848 | 0.368 us | } /* wbt_track */
3) pr-5848 | 0.737 us | } /* __rq_qos_track */
3) pr-5848 | 0.063 us | blk_rq_bio_prep();
3) pr-5848 | | blk_account_io_start() {
3) pr-5848 | 0.055 us | disk_map_sector_rcu();
3) pr-5848 | 0.072 us | update_io_ticks();
3) pr-5848 | 0.754 us | } /* blk_account_io_start */
3) pr-5848 | 0.075 us | blk_add_rq_to_plug();
3) pr-5848 | + 11.588 us | } /* blk_mq_make_request */
3) pr-5848 | + 29.610 us | } /* generic_make_request */
3) pr-5848 | + 30.019 us | } /* submit_bio */
3) pr-5848 | + 48.684 us | } /* iomap_readpages */
3) pr-5848 | + 49.049 us | } /* xfs_vm_readpages [xfs] */
3) pr-5848 | 0.044 us | put_pages_list();
3) pr-5848 | | blk_finish_plug() {
3) pr-5848 | | blk_flush_plug_list() {
3) pr-5848 | | blk_mq_flush_plug_list() {
3) pr-5848 | | blk_mq_sched_insert_requests() {
3) pr-5848 | | dd_insert_requests() {
3) pr-5848 | 0.042 us | _raw_spin_lock();
3) pr-5848 | | blk_mq_sched_try_insert_merge() {
3) pr-5848 | | elv_attempt_insert_merge() {
3) pr-5848 | 0.039 us | elv_rqhash_find();
3) pr-5848 | 0.371 us | } /* elv_attempt_insert_merge */
3) pr-5848 | 0.699 us | } /* blk_mq_sched_try_insert_merge */
3) pr-5848 | 0.043 us | blk_mq_sched_request_inserted();
3) pr-5848 | 0.075 us | elv_rb_add();
3) pr-5848 | 0.043 us | elv_rqhash_add();
3) pr-5848 | 2.470 us | } /* dd_insert_requests */
3) pr-5848 | | blk_mq_run_hw_queue() {
3) pr-5848 | 0.047 us | dd_has_work();
3) pr-5848 | | __blk_mq_delay_run_hw_queue() {
3) pr-5848 | | __blk_mq_run_hw_queue() {
3) pr-5848 | | blk_mq_sched_dispatch_requests() {
3) pr-5848 | | __blk_mq_sched_dispatch_requests() {
3) pr-5848 | | __blk_mq_do_dispatch_sched() {
3) pr-5848 | 0.040 us | dd_has_work();
3) pr-5848 | 0.214 us | scsi_mq_get_budget();
3) pr-5848 | | dd_dispatch_request() {
3) pr-5848 | 0.040 us | _raw_spin_lock();
3) pr-5848 | | deadline_remove_request() {
3) pr-5848 | 0.059 us | elv_rb_del();
3) pr-5848 | 0.050 us | elv_rqhash_del();
3) pr-5848 | 0.729 us | } /* deadline_remove_request */
3) pr-5848 | 1.462 us | } /* dd_dispatch_request */
3) pr-5848 | 0.039 us | scsi_mq_set_rq_budget_token();
3) pr-5848 | 0.227 us | blk_mq_get_driver_tag();
3) pr-5848 | 0.055 us | dd_has_work();
3) pr-5848 | | blk_mq_dispatch_rq_list() {
3) pr-5848 | 0.050 us | blk_mq_get_driver_tag();
3) pr-5848 | | scsi_queue_rq() {
3) pr-5848 | | scsi_init_command() {
3) pr-5848 | 0.041 us | scsi_req_init();
3) pr-5848 | 0.038 us | init_timer_key();
3) pr-5848 | 0.041 us | scsi_add_cmd_to_list();
3) pr-5848 | 1.238 us | } /* scsi_init_command */
3) pr-5848 | | blk_mq_start_request() {
3) pr-5848 | 0.068 us | ktime_get();
3) pr-5848 | | __rq_qos_issue() {
3) pr-5848 | 0.039 us | wbt_issue();
3) pr-5848 | 0.410 us | } /* __rq_qos_issue */
3) pr-5848 | 0.040 us | blk_add_timer();
3) pr-5848 | 1.498 us | } /* blk_mq_start_request */
3) pr-5848 | | sd_init_command [sd_mod]() {
3) pr-5848 | | scsi_alloc_sgtables() {
3) pr-5848 | 0.090 us | __blk_rq_map_sg();
3) pr-5848 | 0.534 us | } /* scsi_alloc_sgtables */
3) pr-5848 | 1.068 us | } /* sd_init_command [sd_mod] */
3) pr-5848 | 0.039 us | scsi_log_send();
3) pr-5848 | | ata_scsi_queuecmd [libata]() {
3) pr-5848 | 0.117 us | _raw_spin_lock_irqsave();
3) pr-5848 | | ata_scsi_find_dev [libata]() {
3) pr-5848 | | __ata_scsi_find_dev [libata]() {
3) pr-5848 | 0.057 us | ata_find_dev [libata]();
3) pr-5848 | 0.384 us | } /* __ata_scsi_find_dev [libata] */
3) pr-5848 | 0.696 us | } /* ata_scsi_find_dev [libata] */
3) pr-5848 | | ata_scsi_translate [libata]() {
3) pr-5848 | 0.107 us | ata_qc_new_init [libata]();
3) pr-5848 | 0.040 us | ata_sg_init [libata]();
3) pr-5848 | | ata_scsi_rw_xlat [libata]() {
3) pr-5848 | 0.093 us | ata_build_rw_tf [libata]();
3) pr-5848 | 0.482 us | } /* ata_scsi_rw_xlat [libata] */
3) pr-5848 | | ahci_pmp_qc_defer [libahci]() {
3) pr-5848 | 0.063 us | ata_std_qc_defer [libata]();
3) pr-5848 | 0.385 us | } /* ahci_pmp_qc_defer [libahci] */
3) pr-5848 | | ata_qc_issue [libata]() {
3) pr-5848 | | dma_map_sg_attrs() {
3) pr-5848 | 0.086 us | dma_direct_map_sg();
3) pr-5848 | 0.500 us | } /* dma_map_sg_attrs */
3) pr-5848 | | ahci_qc_prep [libahci]() {
3) pr-5848 | 0.074 us | ata_tf_to_fis [libata]();
3) pr-5848 | 0.510 us | } /* ahci_qc_prep [libahci] */
3) pr-5848 | + 13.155 us | ahci_qc_issue [libahci]();
3) pr-5848 | + 15.299 us | } /* ata_qc_issue [libata] */
3) pr-5848 | + 18.050 us | } /* ata_scsi_translate [libata] */
3) pr-5848 | 0.062 us | _raw_spin_unlock_irqrestore();
3) pr-5848 | + 20.357 us | } /* ata_scsi_queuecmd [libata] */
3) pr-5848 | + 26.123 us | } /* scsi_queue_rq */
3) pr-5848 | + 26.976 us | } /* blk_mq_dispatch_rq_list */
3) pr-5848 | + 31.596 us | } /* __blk_mq_do_dispatch_sched */
3) pr-5848 | | __blk_mq_do_dispatch_sched() {
3) pr-5848 | 0.041 us | dd_has_work();
3) pr-5848 | 0.535 us | } /* __blk_mq_do_dispatch_sched */
3) pr-5848 | + 32.795 us | } /* __blk_mq_sched_dispatch_requests */
3) pr-5848 | + 33.121 us | } /* blk_mq_sched_dispatch_requests */
3) pr-5848 | + 33.478 us | } /* __blk_mq_run_hw_queue */
3) pr-5848 | + 33.907 us | } /* __blk_mq_delay_run_hw_queue */
3) pr-5848 | + 34.645 us | } /* blk_mq_run_hw_queue */
3) pr-5848 | + 37.767 us | } /* blk_mq_sched_insert_requests */
3) pr-5848 | + 38.153 us | } /* blk_mq_flush_plug_list */
3) pr-5848 | + 38.557 us | } /* blk_flush_plug_list */
3) pr-5848 | + 39.060 us | } /* blk_finish_plug */
3) pr-5848 | + 89.614 us | } /* read_pages */
3) pr-5848 | + 94.473 us | } /* __do_page_cache_readahead */
3) pr-5848 | + 94.838 us | } /* ondemand_readahead */
3) pr-5848 | + 95.539 us | } /* page_cache_sync_readahead */
3) pr-5848 | | pagecache_get_page() {
3) pr-5848 | | find_get_entry() {
3) pr-5848 | 0.050 us | PageHuge();
3) pr-5848 | 0.423 us | } /* find_get_entry */
3) pr-5848 | 0.787 us | } /* pagecache_get_page */
3) pr-5848 | 0.167 us | _raw_spin_lock_irq();
3) pr-5848 | | io_schedule() {
3) pr-5848 | 0.051 us | io_schedule_prepare();
3) pr-5848 | | schedule() {
3) pr-5848 | | rcu_note_context_switch() {
3) pr-5848 | 0.046 us | rcu_qs();
3) pr-5848 | 0.399 us | } /* rcu_note_context_switch */
3) pr-5848 | 0.056 us | _raw_spin_lock();
3) pr-5848 | | update_rq_clock() {
3) pr-5848 | 0.056 us | update_irq_load_avg();
3) pr-5848 | 0.495 us | } /* update_rq_clock */
3) pr-5848 | | dequeue_task_fair() {
3) pr-5848 | | dequeue_entity() {
3) pr-5848 | | update_curr() {
3) pr-5848 | 0.059 us | update_min_vruntime();
3) pr-5848 | 0.152 us | cpuacct_charge();
3) pr-5848 | 0.956 us | } /* update_curr */
3) pr-5848 | | __update_load_avg_se() {
3) pr-5848 | 0.041 us | __accumulate_pelt_segments();
3) pr-5848 | 0.457 us | } /* __update_load_avg_se */
3) pr-5848 | | __update_load_avg_cfs_rq() {
3) pr-5848 | 0.039 us | __accumulate_pelt_segments();
3) pr-5848 | 0.438 us | } /* __update_load_avg_cfs_rq */
3) pr-5848 | 0.049 us | clear_buddies();
3) pr-5848 | 0.041 us | update_cfs_group();
3) pr-5848 | 0.058 us | update_min_vruntime();
3) pr-5848 | 3.931 us | } /* dequeue_entity */
3) pr-5848 | 0.039 us | hrtick_update();
3) pr-5848 | 4.633 us | } /* dequeue_task_fair */
3) pr-5848 | | __delayacct_blkio_start() {
3) pr-5848 | 0.121 us | ktime_get();
3) pr-5848 | 0.464 us | } /* __delayacct_blkio_start */
3) pr-5848 | | pick_next_task_fair() {
3) pr-5848 | | newidle_balance() {
3) pr-5848 | | update_blocked_averages() {
3) pr-5848 | 0.041 us | _raw_spin_lock_irqsave();
3) pr-5848 | 0.081 us | update_rq_clock();
3) pr-5848 | 0.094 us | update_rt_rq_load_avg();
3) pr-5848 | 0.095 us | update_dl_rq_load_avg();
3) pr-5848 | 0.103 us | update_irq_load_avg();
3) pr-5848 | 0.060 us | __update_load_avg_cfs_rq();
3) pr-5848 | 0.063 us | _raw_spin_unlock_irqrestore();
3) pr-5848 | 2.711 us | } /* update_blocked_averages */
3) pr-5848 | | load_balance() {
3) pr-5848 | | find_busiest_group() {
3) pr-5848 | 0.070 us | update_nohz_stats();
3) pr-5848 | 0.040 us | idle_cpu();
3) pr-5848 | | update_nohz_stats() {
3) pr-5848 | | update_blocked_averages() {
3) pr-5848 | 0.042 us | _raw_spin_lock_irqsave();
3) pr-5848 | | update_rq_clock() {
3) pr-5848 | | update_irq_load_avg() {
3) pr-5848 | 0.040 us | __accumulate_pelt_segments();
3) pr-5848 | 0.504 us | } /* update_irq_load_avg */
3) pr-5848 | 0.915 us | } /* update_rq_clock */
3) pr-5848 | 0.076 us | update_rt_rq_load_avg();
3) pr-5848 | 0.077 us | update_dl_rq_load_avg();
3) pr-5848 | 0.060 us | update_irq_load_avg();
3) pr-5848 | 0.114 us | __update_load_avg_cfs_rq();
3) pr-5848 | 0.060 us | _raw_spin_unlock_irqrestore();
3) pr-5848 | 3.518 us | } /* update_blocked_averages */
3) pr-5848 | 3.902 us | } /* update_nohz_stats */
3) pr-5848 | 0.053 us | idle_cpu();
3) pr-5848 | | update_nohz_stats() {
3) pr-5848 | | update_blocked_averages() {
3) pr-5848 | 0.042 us | _raw_spin_lock_irqsave();
3) pr-5848 | 0.130 us | update_rq_clock();
3) pr-5848 | 0.070 us | update_rt_rq_load_avg();
3) pr-5848 | 0.066 us | update_dl_rq_load_avg();
3) pr-5848 | 0.103 us | update_irq_load_avg();
3) pr-5848 | 0.087 us | __update_load_avg_cfs_rq();
3) pr-5848 | 0.062 us | _raw_spin_unlock_irqrestore();
3) pr-5848 | 2.566 us | } /* update_blocked_averages */
3) pr-5848 | 2.919 us | } /* update_nohz_stats */
3) pr-5848 | 0.044 us | idle_cpu();
3) pr-5848 | | update_nohz_stats() {
3) pr-5848 | | update_blocked_averages() {
3) pr-5848 | 0.073 us | _raw_spin_lock_irqsave();
3) pr-5848 | 0.092 us | update_rq_clock();
3) pr-5848 | 0.079 us | update_rt_rq_load_avg();
3) pr-5848 | 0.063 us | update_dl_rq_load_avg();
3) pr-5848 | 0.085 us | update_irq_load_avg();
3) pr-5848 | 0.063 us | __update_load_avg_cfs_rq();
3) pr-5848 | 0.062 us | _raw_spin_unlock_irqrestore();
3) pr-5848 | 2.537 us | } /* update_blocked_averages */
3) pr-5848 | 2.881 us | } /* update_nohz_stats */
3) pr-5848 | 0.039 us | idle_cpu();
3) pr-5848 | + 12.912 us | } /* find_busiest_group */
3) pr-5848 | + 13.427 us | } /* load_balance */
3) pr-5848 | 0.040 us | __msecs_to_jiffies();
3) pr-5848 | 0.038 us | _raw_spin_lock();
3) pr-5848 | + 17.782 us | } /* newidle_balance */
3) pr-5848 | + 18.165 us | } /* pick_next_task_fair */
3) pr-5848 | | put_prev_task_fair() {
3) pr-5848 | | put_prev_entity() {
3) pr-5848 | 0.043 us | check_cfs_rq_runtime();
3) pr-5848 | 0.403 us | } /* put_prev_entity */
3) pr-5848 | 0.738 us | } /* put_prev_task_fair */
3) pr-5848 | | pick_next_task_idle() {
3) pr-5848 | 0.039 us | set_next_task_idle();
3) pr-5848 | 0.375 us | } /* pick_next_task_idle */
3) pr-5848 | | enter_lazy_tlb() {
3) pr-5848 | | switch_mm() {
3) pr-5848 | | switch_mm_irqs_off() {
3) pr-5848 | 0.594 us | load_new_mm_cr3();
3) pr-5848 | 1.351 us | } /* switch_mm_irqs_off */
3) pr-5848 | 1.691 us | } /* switch_mm */
3) pr-5848 | 2.015 us | } /* enter_lazy_tlb */
3) pr-5848 | 0.142 us | copy_fpregs_to_fpstate();
3) pr-5848 | 0.156 us | finish_task_switch();
3) pr-5848 | ! 465.876 us | } /* schedule */
3) pr-5848 | ! 466.622 us | } /* io_schedule */
3) pr-5848 | 0.053 us | finish_wait();
3) pr-5848 | 0.069 us | mark_page_accessed();
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.042 us | rcu_all_qs();
3) pr-5848 | 0.358 us | } /* _cond_resched */
3) pr-5848 | | _cond_resched() {
3) pr-5848 | 0.041 us | rcu_all_qs();
3) pr-5848 | 0.356 us | } /* _cond_resched */
3) pr-5848 | | pagecache_get_page() {
3) pr-5848 | | find_get_entry() {
3) pr-5848 | 0.048 us | PageHuge();
3) pr-5848 | 0.542 us | } /* find_get_entry */
3) pr-5848 | 0.899 us | } /* pagecache_get_page */
3) pr-5848 | | touch_atime() {
3) pr-5848 | | atime_needs_update() {
3) pr-5848 | | current_time() {
3) pr-5848 | 0.095 us | ktime_get_coarse_real_ts64();
3) pr-5848 | 0.066 us | timestamp_truncate();
3) pr-5848 | 0.804 us | } /* current_time */
3) pr-5848 | 1.317 us | } /* atime_needs_update */
3) pr-5848 | 1.695 us | } /* touch_atime */
3) pr-5848 | ! 571.940 us | } /* generic_file_buffered_read */
3) pr-5848 | ! 572.293 us | } /* generic_file_read_iter */
3) pr-5848 | | xfs_iunlock [xfs]() {
3) pr-5848 | 0.062 us | up_read();
3) pr-5848 | 0.454 us | } /* xfs_iunlock [xfs] */
3) pr-5848 | ! 575.148 us | } /* xfs_file_buffered_aio_read [xfs] */
3) pr-5848 | ! 575.728 us | } /* xfs_file_read_iter [xfs] */
3) pr-5848 | ! 576.240 us | } /* new_sync_read */
3) pr-5848 | ! 576.601 us | } /* __vfs_read */
3) pr-5848 | 0.042 us | __fsnotify_parent();
3) pr-5848 | 0.088 us | fsnotify();
3) pr-5848 | ! 581.125 us | } /* vfs_read */
3) pr-5848 | ! 582.583 us | } /* ksys_pread64 */
Reference
이 문제에 관하여(linux 읽기 호출 분석, 제2부분), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yugabyte/the-anatomy-of-a-linux-read-call-part-2-1aoi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)