Samuel Thibault, on Wed 20 Apr 2016 01:07:09 +0200, wrote: > Samuel Thibault, on Tue 19 Apr 2016 12:18:01 +0200, wrote: > > Svante Signell, on Tue 19 Apr 2016 12:08:07 +0200, wrote: > > > > Looking at ps -feMj, it seems that it's ext2fs which consumes much more > > > > CPU time, thus increasing overall wallclock time. It'd probably be > > > > interesting to profile ext2fs, to see what takes longer. Perhaps it's > > > > the hash table which is less efficient since with the new page cache > > > > policy there are much more cached files? > > > > > > Are you preparing ext2fs for profiling? .../pkg-glibc/glibc: hurd-i386: > > > Fix > > > recording profiling from ext2fs > > > > Yes. I just got the results, attached here. > > I have now pushed a wiki page for profiling the kernel, which is more > involved: > http://darnassus.sceen.net/~hurd-web/microkernel/mach/gnumach/profiling/ > The glibc build is going on, results available later :)
Here is the profiling for the new policy. So half of the time is spent in vm_map_enter.part.0, and looking more closely at the addresses, it's exactly the while(TRUE) loop between lines 777 and 830. This indeed loops over all vm_map_entries of the process, which are plenty when we have a lot of cache (a mere find /usr on my system brings 11400 cached objects, and vminfo on ext2fs shows 3240 entries). Most of the time, these are contiguous, so it's kind of stupid to look again at each and every of them to find room. I guess we can introduce a much better algorithm, by maintaining pointers to the free areas. Samuel
77m22.980s USER PID PPID PGRP SESS LCOLL STAT TIME COMMAND root 1 1 1 1 1 Sslo 0:00.07 init [2] - 2 1 1 1 1 Sp 0:00.00 /hurd/startup root=device: - 3 1 1 1 1 D<p 0:17.62 root=device:hd1 console=co - 4 2 1 1 1 R<mo 1:15.91 /hurd/proc - 5 2 1 1 1 S<o 7:05.29 ext2fs --readonly --multib - 6 5 1 1 1 S<o 0:50.76 /hurd/exec - 7 2 1 1 1 S<o 0:06.08 /hurd/auth root 8 5 1 1 1 S<o 0:00.06 /hurd/term /dev/console de root 9 5 1 1 1 S<o 0:17.82 /hurd/pflocal root 11 1 11 11 1 Ssfo 0:00.06 /hurd/mach-defpager root 15 5 1 1 1 S<o 0:00.00 /hurd/fifo - 19 5 1 1 1 So 0:17.03 /hurd/null root 23 5 1 1 1 S<o 0:00.00 /hurd/storeio hd1 root 24 5 1 1 1 S<o 0:00.00 /hurd/storeio hd0s1 root 25 5 1 1 1 S<o 0:00.00 /hurd/storeio hd3s1 root 26 5 1 1 1 S<o 0:00.01 /hurd/storeio hd2 root 27 1 14 14 1 S<o 0:00.01 /hurd/procfs --compatible root 37 5 1 1 1 S<o 0:00.00 /hurd/proxy-defpager root 85 1 14 14 1 S<o 0:00.02 /hurd/tmpfs --nosuid --noe root 86 5 1 1 1 S<o 0:00.00 /hurd/storeio --no-cache t root 100 1 14 14 1 S<o 0:00.00 /hurd/tmpfs --noexec --nos root 169 1 14 14 1 S<o 0:00.00 /hurd/tmpfs --nosuid --noe - 205 27 14 14 1 So 0:00.00 /hurd/mtab / root 412 1 14 14 1 S<o 0:00.06 /hurd/ext2fs /dev/hd0s1 root 511 5 1 1 1 So 0:00.17 /hurd/magic tty root 522 5 1 1 1 S<o 0:00.52 /hurd/random --seed-file / root 542 5 1 1 1 S<o 0:07.14 /hurd/pfinet -i /dev/eth0 root 543 5 1 1 1 So 0:00.00 /hurd/devnode -M /dev/netd root 544 5 1 1 1 So 0:00.00 devnode -n eth0 eth0 root 637 85 14 14 1 S<o 0:00.01 /hurd/fifo root 650 5 1 1 1 S<o 0:00.00 /hurd/streamio kmsg root 691 1 691 691 1 Ssfo 0:00.00 /usr/sbin/cron messagebus 715 1 715 715 1 Ssfo 0:00.00 /usr/bin/dbus-daemon --sys root 720 5 1 1 1 S<o 0:00.00 /hurd/term /dev/tty1 hurdi root 721 5 1 1 1 S<o 0:00.00 /hurd/console root 726 1 725 725 1 S<fo 0:00.18 /bin/console --daemonize - root 727 5 1 1 1 S<o 0:00.00 /hurd/storeio --no-cache m root 734 1 732 732 1 Sfo 0:00.00 /usr/sbin/inetutils-inetd root 764 1 764 764 1 Ssfo 0:00.00 /usr/sbin/sshd - 785 1 785 785 785 Sslo 0:00.00 /bin/bash -noprofile /bin/ - 786 1 786 786 786 Sslo 0:00.02 /bin/bash -noprofile /bin/ - 787 1 787 787 787 Sslo 0:00.00 /bin/bash -noprofile /bin/ - 788 1 788 788 788 Sslo 0:00.00 /bin/bash -noprofile /bin/ - 789 1 789 789 789 Sslo 0:00.00 /bin/bash -noprofile /bin/ - 790 1 790 790 790 Sslo 0:00.00 /bin/bash -noprofile /bin/ - 791 1 791 791 791 Sslo 0:00.00 /bin/bash -noprofile /bin/ root 792 5 1 1 1 S<o 0:00.00 /hurd/term /dev/tty3 hurdi root 793 5 1 1 1 S<o 0:00.00 /hurd/term /dev/tty2 hurdi root 794 5 1 1 1 S<o 0:00.00 /hurd/term /dev/tty5 hurdi root 795 5 1 1 1 S<o 0:00.01 /hurd/term /dev/tty4 hurdi root 796 5 1 1 1 S<o 0:00.00 /hurd/term /dev/tty6 hurdi root 797 5 1 1 1 S<o 0:00.01 /hurd/password root 798 734 732 732 1 So 0:00.06 telnetd root 799 5 1 1 1 S<o 0:00.09 /hurd/term /dev/ptyp0 pty- root 800 798 800 800 800 Sslo 0:00.06 -bash root 815 1 814 800 1 S<o 25:52.77 /hurd/ext2fs.prof /dev/hd3 root 816 734 732 732 1 So 0:00.79 telnetd root 817 5 1 1 1 S<o 0:18.74 /hurd/term /dev/ptyp1 pty- samy 818 816 818 818 818 Sslow 0:00.10 -bash root 3159 818 3159 818 818 S 0:00.00 ps -feMj root 19593 5 1 1 1 S<o 0:00.00 /hurd/fifo Flat profile: Each sample counts as 0.0001 seconds. % cumulative self self total time seconds seconds calls Ts/call Ts/call name 55.05 2.82 2.82 vm_map_enter.part.0 6.54 3.15 0.34 spl0 3.23 3.32 0.17 syscall_entry_2 3.20 3.48 0.16 ide_do_request 2.99 3.64 0.15 rdxtree_lookup_common 2.27 3.75 0.12 triton_dmaproc 1.46 3.83 0.07 ide_wait_stat 1.28 3.89 0.07 t_page_fault 1.19 3.96 0.06 vm_page_lookup 1.09 4.01 0.06 lock_done 1.08 4.07 0.06 memset 0.98 4.12 0.05 kmem_cache_alloc 0.96 4.17 0.05 mach_msg_trap 0.93 4.21 0.05 vm_map_copyout 0.83 4.26 0.04 lock_write 0.82 4.30 0.04 copyoutmsg 0.53 4.33 0.03 kmem_cache_free 0.51 4.35 0.03 syscall_native 0.50 4.38 0.03 ipc_kmsg_copyin_header 0.48 4.40 0.02 spl7 0.43 4.42 0.02 ipc_right_lookup_write 0.42 4.44 0.02 ipc_kmsg_queue_next 0.38 4.46 0.02 copyinmsg 0.37 4.48 0.02 _kret_popl_fs 0.37 4.50 0.02 _kret_popl_gs 0.35 4.52 0.02 ipc_kobject_server 0.33 4.54 0.02 pmap_remove_range 0.32 4.55 0.02 ipc_right_copyin 0.31 4.57 0.02 pmap_enter 0.30 4.58 0.02 ipc_mqueue_send 0.29 4.60 0.02 ipc_kmsg_copyin_body 0.29 4.61 0.01 port_name_to_space 0.29 4.63 0.01 lock_read 0.28 4.64 0.01 ipc_mqueue_copyin 0.26 4.66 0.01 syscall_entry_3 0.25 4.67 0.01 _kret_popl_ds 0.24 4.68 0.01 pmap_remove 0.24 4.69 0.01 t_nofpu 0.22 4.71 0.01 __delay 0.22 4.72 0.01 fpnoextflt 0.20 4.73 0.01 vm_object_enter 0.19 4.74 0.01 vm_fault 0.19 4.75 0.01 vm_map 0.18 4.75 0.01 ipc_mqueue_move 0.18 4.76 0.01 vm_map_lookup_entry 0.17 4.77 0.01 vm_fault_page 0.17 4.78 0.01 copyout 0.17 4.79 0.01 syscall_vm_map 0.16 4.80 0.01 ipc_mqueue_receive 0.16 4.81 0.01 ipc_kmsg_get 0.16 4.81 0.01 pmap_pte 0.15 4.82 0.01 _kret_popl_es 0.15 4.83 0.01 mach_call_call 0.15 4.84 0.01 ipc_kmsg_copyout_body 0.14 4.84 0.01 user_trap 0.13 4.85 0.01 memcpy 0.13 4.86 0.01 vm_object_deallocate 0.12 4.86 0.01 ll_rw_block 0.12 4.87 0.01 fp_load 0.12 4.88 0.01 port_name_to_map 0.11 4.88 0.01 vm_object_cache_remove 0.10 4.89 0.01 mach_msg_send 0.10 4.89 0.01 vm_map_delete 0.10 4.90 0.00 vm_map_lookup 0.09 4.90 0.00 ipc_port_release_send 0.09 4.91 0.00 mach_msg_receive 0.09 4.91 0.00 _kret_iret 0.09 4.92 0.00 trap_push_segs 0.09 4.92 0.00 ipc_object_copyin 0.09 4.93 0.00 ipc_right_dealloc 0.09 4.93 0.00 rbtree_insert_rebalance 0.08 4.93 0.00 copyinmsg_ret 0.08 4.94 0.00 ipc_entry_alloc 0.08 4.94 0.00 phys_attribute_test 0.08 4.95 0.00 ipc_kmsg_put 0.08 4.95 0.00 rdxtree_remove 0.08 4.96 0.00 kfree 0.08 4.96 0.00 rbtree_remove 0.07 4.96 0.00 convert_port_to_space 0.07 4.97 0.00 _Xmach_port_set_protected_payload 0.07 4.97 0.00 ipc_kmsg_copyout_header 0.07 4.97 0.00 ipc_right_delta 0.07 4.98 0.00 pmap_page_protect 0.07 4.98 0.00 vm_object_page_remove 0.06 4.98 0.00 _Xmach_port_mod_refs 0.06 4.99 0.00 ipc_right_check 0.06 4.99 0.00 phys_attribute_clear 0.06 4.99 0.00 rdxtree_insert_common 0.06 5.00 0.00 ipc_kmsg_copyout_object.part.6 0.06 5.00 0.00 ipc_port_destroy 0.06 5.00 0.00 kalloc 0.05 5.01 0.00 copyin 0.05 5.01 0.00 vm_map_enter 0.05 5.01 0.00 ipc_object_copyin_type 0.05 5.01 0.00 vm_map_entry_delete 0.05 5.02 0.00 _Xmach_port_move_member 0.05 5.02 0.00 copyoutmsg_ret 0.05 5.02 0.00 ipc_object_copyout_name 0.05 5.02 0.00 thread_block 0.05 5.03 0.00 ipc_kmsg_copyin 0.04 5.03 0.00 mach_port_move_member 0.04 5.03 0.00 ipc_object_alloc 0.04 5.03 0.00 ipc_right_copyout 0.04 5.03 0.00 ipc_right_reverse 0.04 5.04 0.00 mach_msg_receive_continue 0.04 5.04 0.00 pmap_valid_page 0.04 5.04 0.00 syscall_mach_port_deallocate 0.04 5.04 0.00 thread_will_wait_with_timeout 0.04 5.04 0.00 syscall_mach_port_insert_right 0.03 5.05 0.00 ipc_entry_dealloc 0.03 5.05 0.00 rdxtree_remove_bm_set 0.03 5.05 0.00 copyout_ret 0.03 5.05 0.00 syscall_vm_deallocate 0.03 5.05 0.00 ipc_object_copyout 0.03 5.05 0.00 vm_fault_cleanup 0.03 5.06 0.00 mach_port_deallocate 0.03 5.06 0.00 rbtree_rotate 0.03 5.06 0.00 vm_page_deactivate 0.03 5.06 0.00 _return_from_trap 0.03 5.06 0.00 ipc_port_alloc 0.03 5.06 0.00 ipc_pset_remove 0.03 5.06 0.00 mach_port_mod_refs 0.03 5.07 0.00 syscall_mach_port_allocate 0.03 5.07 0.00 user_page_fault_continue 0.03 5.07 0.00 vm_object_copy_delayed 0.02 5.07 0.00 _vm_map_entry_create 0.02 5.07 0.00 copyin_ret 0.02 5.07 0.00 ipc_pset_move 0.02 5.07 0.00 vm_object_lookup 0.02 5.07 0.00 vm_page_free 0.02 5.07 0.00 ipc_object_translate 0.02 5.08 0.00 ipc_thread_dequeue 0.02 5.08 0.00 thread_syscall_return 0.02 5.08 0.00 vm_map_copyin.part.2 0.02 5.08 0.00 vm_page_alloc_pa 0.02 5.08 0.00 ipc_entry_alloc_name 0.02 5.08 0.00 memory_object_lock_request 0.02 5.08 0.00 rdwr_full 0.02 5.08 0.00 vm_page_insert 0.02 5.08 0.00 vm_page_mem_free 0.02 5.09 0.00 vm_page_seg_alloc_from_buddy 0.02 5.09 0.00 _vm_map_clip_start 0.02 5.09 0.00 ipc_port_clear_receiver 0.02 5.09 0.00 space_deallocate 0.02 5.09 0.00 thread_go 0.02 5.09 0.00 _Xmach_port_request_notification 0.02 5.09 0.00 _vm_map_clip_end 0.02 5.09 0.00 ipc_mqueue_changed 0.02 5.09 0.00 mach_port_insert_right 0.02 5.09 0.00 thread_handoff 0.02 5.09 0.00 vm_map_deallocate 0.02 5.09 0.00 vm_map_remove 0.02 5.10 0.00 vm_map_verify 0.01 5.10 0.00 vm_map_copy_page_discard 0.01 5.10 0.00 vm_map_copyin_page_list.part.3 0.01 5.10 0.00 vm_page_remove 0.01 5.10 0.00 _Xdevice_write 0.01 5.10 0.00 __wait_on_buffer 0.01 5.10 0.00 ipc_kmsg_dequeue 0.01 5.10 0.00 ipc_object_release 0.01 5.10 0.00 ipc_target_init 0.01 5.10 0.00 mach_port_set_protected_payload 0.01 5.10 0.00 memory_object_lock_page 0.01 5.10 0.00 thread_bootstrap_return 0.01 5.10 0.00 thread_will_wait 0.01 5.10 0.00 vm_page_free_pa 0.01 5.10 0.00 dev_port_lookup 0.01 5.10 0.00 device_read 0.01 5.10 0.00 device_write 0.01 5.11 0.00 ipc_kmsg_copyout 0.01 5.11 0.00 ipc_kmsg_destroy 0.01 5.11 0.00 ipc_mqueue_init 0.01 5.11 0.00 trap_set_segs 0.01 5.11 0.00 check_limit 0.01 5.11 0.00 ipc_object_copyin_from_kernel 0.01 5.11 0.00 ipc_port_nsrequest 0.01 5.11 0.00 ipc_port_set_protected_payload 0.01 5.11 0.00 mach_port_allocate 0.01 5.11 0.00 rdxtree_cleanup 0.01 5.11 0.00 thread_invoke 0.01 5.11 0.00 vm_map_copy_discard 0.01 5.11 0.00 vm_object_collapse.part.6 0.01 5.11 0.00 vm_page_convert 0.01 5.11 0.00 vm_page_grab_fictitious 0.01 5.11 0.00 vm_page_seg_free_to_buddy 0.01 5.11 0.00 _Xmemory_object_data_supply 0.01 5.11 0.00 call_continuation 0.01 5.11 0.00 get_block_size 0.01 5.11 0.00 ipc_kmsg_copyin_from_kernel 0.01 5.11 0.00 ipc_notify_no_senders 0.01 5.11 0.00 ipc_port_lock_mqueue 0.01 5.11 0.00 mach_msg_continue 0.01 5.11 0.00 pmap_clear_modify 0.01 5.11 0.00 trap_from_user 0.01 5.11 0.00 vm_deallocate 0.01 5.11 0.00 vm_page_activate 0.01 5.12 0.00 vm_page_zero_fill 0.01 5.12 0.00 vm_pageout_setup 0.00 5.12 0.00 _Xmemory_object_lock_request 0.00 5.12 0.00 __const_udelay 0.00 5.12 0.00 _vm_object_allocate 0.00 5.12 0.00 block_write 0.00 5.12 0.00 ds_device_write 0.00 5.12 0.00 ds_device_write_reply 0.00 5.12 0.00 ipc_kmsg_clean 0.00 5.12 0.00 ipc_kmsg_get_from_kernel 0.00 5.12 0.00 ipc_port_init 0.00 5.12 0.00 ipc_pset_add 0.00 5.12 0.00 ipc_target_terminate 0.00 5.12 0.00 mach_msg_send_from_kernel 0.00 5.12 0.00 mach_port_request_notification 0.00 5.12 0.00 memory_object_data_supply 0.00 5.12 0.00 pmap_is_modified 0.00 5.12 0.00 pmap_zero_page 0.00 5.12 0.00 rdxtree_node_create 0.00 5.12 0.00 retrieve_thread_self_fast 0.00 5.12 0.00 schedule 0.00 5.12 0.00 vm_map_copyin 0.00 5.12 0.00 vm_map_copyin_page_list 0.00 5.12 0.00 vm_object_remove 0.00 5.12 0.00 vm_object_terminate 0.00 5.12 0.00 vm_page_release_fictitious 0.00 5.12 0.00 _Xmemory_object_change_attributes 0.00 5.12 0.00 _Xvm_copy 0.00 5.12 0.00 _take_trap 0.00 5.12 0.00 block_read 0.00 5.12 0.00 copyoutmsg_fail 0.00 5.12 0.00 do_rdwr 0.00 5.12 0.00 ipc_kobject_set 0.00 5.12 0.00 memory_object_data_request 0.00 5.12 0.00 memory_object_data_unlock 0.00 5.12 0.00 pmap_clear_reference 0.00 5.12 0.00 rdxtree_insert_alloc_common 0.00 5.12 0.00 vm_external_destroy 0.00 5.12 0.00 vm_map_copyin_object 0.00 5.12 0.00 vm_object_coalesce 0.00 5.12 0.00 vm_object_reference 0.00 5.12 0.00 vm_page_lookup_pa 0.00 5.12 0.00 copyout_fail % the percentage of the total running time of the time program used by this function. cumulative a running sum of the number of seconds accounted seconds for by this function and those listed above it. self the number of seconds accounted for by this seconds function alone. This is the major sort for this listing. calls the number of times this function was invoked, if this function is profiled, else blank. self the average number of milliseconds spent in this ms/call function per call, if this function is profiled, else blank. total the average number of milliseconds spent in this ms/call function and its descendents per call, if this function is profiled, else blank. name the name of the function. This is the minor sort for this listing. The index shows the location of the function in the gprof listing. If the index is in parenthesis it shows where it would appear in the gprof listing if it were to be printed. Copyright (C) 2012-2015 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved.