User Tools

Site Tools


releases:3.2.0:developersguide:statisticalprofiling

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

releases:3.2.0:developersguide:statisticalprofiling [2014/11/14 18:02] (current)
lionelsambuc created
Line 1: Line 1:
 +===== Statistical profiling =====
 +Minix 3 supports statistical profiling. It is available in two versions. The basic one is based on BIOS RTC interrupts. This is available on any x86 machine and in virtual machines. As interrupts are not enabled in kernel this method does not make kernel profiling possible. The second method is using non-maskable interrupts (NMI) which also interrupt the kernel. This requires APIC mode. The NMIs are generated using performance counters. Each platform provides different counters, therefore Minix has to support each platform separately.
 +
 +==== Prerequisites ====
 +Before statistical profiling can be used, some configuration changes must be made in MINIX. In ''/​usr/​src/​include/​minix/​config.h'',​ set the ''​SPROFILE''​ constant to ''​1''​. This causes the kernel to allocate a huge buffer to store profiling samples. After these changes, a ''​make world''​ command (in ''/​usr/​src''​) is needed to compile and install the new image.
 +
 +If you want to use NMI rather than RTC, additional configuration changes are needed. In ''/​usr/​src/​kernel/​config.h'',​ add:
 +<​code>​
 +#define USE_APIC ​    1
 +#define USE_ACPI ​    1
 +#define USE_WATCHDOG 1
 +</​code>​
 +After this, the boot image must be recompiled and installed (''​make install''​ in ''/​usr/​src/​tools''​ or simply ''​make world''​ in ''/​usr/​src''​ to do everything in one go). You must also pass some kernel parameters from the bootloader to make this work. Edit ''/​boot.cfg''​ to add a menu item that includes the following arguments: ''​watchdog=1 no_apic=0 acpi=yes''​. Note that ''/​boot.cfg''​ is overwritten when the system is compiled, so it may be more convenient to change the local additions file ''/​etc/​boot.cfg.local,''​ that is never overwritten,​ instead. After booting this new option, NMI statistical profiling should work.
 +
 +==== Usage ====
 +profiling is started and stopped using the **profile** utility, collected result are written in a file. Use **sprofalyze** script to process the data and visualize the results.
 +
 +<​code>​
 +Statistical Profiling:
 +  profile start [--rtc | --nmi] [-m memsize] [-o outfile] [-f frequency]
 +  profile stop
 +
 +   --rtc is default, --nmi allows kernel profiling
 +Call Profiling:
 +  profile get   [-m memsize] [-o outfile]
 +  profile reset
 +
 +   - memsize in MB, default: 64
 +   - default output file: profile.{stat|call}.out
 +   - sample frequencies for --rtc (default: 6):
 +      3    8192 Hz          10     64 Hz
 +      4    4096 Hz          11     32 Hz
 +      5    2048 Hz          12     16 Hz
 +      6    1024 Hz          13      8 Hz
 +      7     512 Hz          14      4 Hz
 +      8     256 Hz          15      2 Hz
 +      9     128 Hz
 +</​code>​
 +==== NMI mode ====
 +When using NMI more any frequncy may be specified in Hz, e.g. -f 10000 for 10kHz.
 +
 +Beware, if no frequency is specified 6 is taken as default which in case of NMI means 6Hz!
 +
 +Suported platforms:
 +
 +  * Intel architecture performance counters - virtually any reasonably //Intel// cpu
 +
 +==== Sample sprofalyze output ====
 +<​code>​
 +================================================================================
 +Data file: profile.stat.out
 +================================================================================
 +
 +  System process ticks: ​     19935 ( 51%)
 +    User process ticks: ​     15339 ( 39%)          Details of system process
 +       Idle time ticks: ​      3690 ( 10%)          samples, aggregated and
 +                        ---------- ​ ----           per process, are below.
 +           Total ticks: ​     38964 (100%)
 +
 +--------------------------------------------------------------------------------
 +Total system process time                                          19935 samples
 +--------------------------------------------------------------------------------
 +  kernel ​                      ​_ipc_entry *****                             5.6%
 +  kernel ​                       _read_tsc ****                              4.6%
 +  kernel ​         ___switch_address_space ***                               3.9%
 +  kernel ​                      ​_phys_copy ***                               3.9%
 +  kernel ​              ​_kernel_call_entry ***                               3.8%
 +  kernel ​                    ​_isokendpt_f ***                               3.6%
 +  kernel ​                   _context_stop ***                               3.5%
 +  kernel ​                    ​_read_tsc_64 **                                2.4%
 +  kernel ​                 _switch_to_user **                                2.4%
 +  kernel ​                         _do_ipc **                                2.3%
 +      vm                 ​__do_kernel_call **                                2.2%
 +  kernel ​           _restore_user_context **                                1.8%
 +  kernel ​                          ​_sub64 **                                1.8%
 +  kernel ​                      ​fill_start **                                1.7%
 +  kernel ​               _copy_msg_to_user **                                1.6%
 +  kernel ​            ​_lapic_restart_timer *                                 1.4%
 +     ​vfs ​                        ​_release *                                 1.4%
 +     ​mfs ​                     _search_dir *                                 1.3%
 +     ​mfs ​                       __receive *                                 1.3%
 +     ​vfs ​                       __sendrec *                                 1.1%
 +  kernel ​                 _virtual_copy_f *                                 1.1%
 +  kernel ​                      ​_mini_send *                                 1.1%
 +     ​mfs ​                          ​__send *                                 1.1%
 +     ​mfs ​                      ​_get_block *                                 1.1%
 +  kernel ​                   _lin_lin_copy *                                 1.0%
 +                             <​1% ******************************* ​ 43.0%
 +--------------------------------------------------------------------------------
 +total                                                                     ​100.0%
 +
 +--------------------------------------------------------------------------------
 +kernel ​                                          59.3% of system process samples
 +--------------------------------------------------------------------------------
 +                      _ipc_entry ************************** ​                9.4%
 +                       ​_read_tsc ********************** ​                    7.8%
 +         ​___switch_address_space ******************* ​                       6.6%
 +                      _phys_copy ****************** ​                        6.5%
 +              _kernel_call_entry ****************** ​                        6.4%
 +                    _isokendpt_f ***************** ​                         6.0%
 +                   ​_context_stop ***************** ​                         5.9%
 +                    _read_tsc_64 ************ ​                              4.1%
 +                 ​_switch_to_user ************ ​                              4.0%
 +                         ​_do_ipc *********** ​                               3.9%
 +           ​_restore_user_context ********* ​                                 3.1%
 +                          _sub64 ********* ​                                 3.0%
 +                      fill_start ******** ​                                  2.9%
 +               ​_copy_msg_to_user ******** ​                                  2.7%
 +            _lapic_restart_timer ******* ​                                   2.3%
 +                 ​_virtual_copy_f ****** ​                                    1.9%
 +                      _mini_send ****** ​                                    1.8%
 +                   ​_lin_lin_copy *****                                      1.7%
 +                        _enqueue ****                                       1.4%
 +                        _dequeue ****                                       1.4%
 +             ​_copy_msg_from_user ****                                       1.3%
 +                      _createpde ****                                       1.2%
 +                             <​1% **************************************** ​ 14.7%
 +--------------------------------------------------------------------------------
 +kernel ​                                                                   100.0%
 +
 +--------------------------------------------------------------------------------
 +vm                                               15.0% of system process samples
 +--------------------------------------------------------------------------------
 +                __do_kernel_call **************************************** ​ 14.6%
 +            _pt_ptalloc_in_range ****************** ​                        6.5%
 +                   ​__kernel_call *************** ​                           5.4%
 +                    _pt_writemap ************** ​                            5.2%
 +                      _slaballoc ************** ​                            5.1%
 +                _physr_incr_iter ************* ​                             4.6%
 +                   ​_physr_remove ********** ​                                3.7%
 +                   ​_physr_insert ********** ​                                3.5%
 +                       ​__receive ********** ​                                3.4%
 +                 ​_map_ph_writept ******* ​                                   2.4%
 +                         ​_pt_new ****** ​                                    2.2%
 +                       ​_slabfree ****** ​                                    2.0%
 +                   ​_physr_search ****** ​                                    2.0%
 +                        _pt_free *****                                      1.8%
 +         ​_physr_start_iter_least *****                                      1.7%
 +                    _addr_insert *****                                      1.7%
 +                    _addr_remove *****                                      1.6%
 +                        _do_fork *****                                      1.6%
 +                           _main ****                                       1.5%
 +                       ​_objstats ****                                       1.4%
 +                     ​_map_lookup ****                                       1.4%
 +                   ​_vm_isokendpt ****                                       1.4%
 +                    _addr_search ****                                       1.3%
 +                      _sys_vmctl ****                                       1.3%
 +                          __send ****                                       1.2%
 +                _addr_start_iter ****                                       1.2%
 +                    _map_writept ****                                       1.2%
 +                         ​_map_pf ***                                        1.1%
 +              _map_new_physblock ***                                        1.1%
 +                    _map_subfree ***                                        1.0%
 +                 ​_physr_get_iter ***                                        1.0%
 +                             <​1% **************************************** ​ 14.9%
 +--------------------------------------------------------------------------------
 +vm                                                                        100.0%
 +</​code>​
  
releases/3.2.0/developersguide/statisticalprofiling.txt · Last modified: 2014/11/14 18:02 by lionelsambuc