Since when does FreeBSD have faster syscalls than Linux?

cracauer@

Developer
Traditionally Linux is faster in userland functions such as string handling (due to their use of SIMD), faster in threading primitives, and system calls about equal.

Now FreeBSD has very fast minimal system call time. Look for getrusage(2), read(2) etc.

FreeBSD-15-PRERELEASE:
Code:
FIXME: back to be changed pages with physical memory first
sizeof char/short/int/long/long_long/void*/size_t/off_t:
1/2/4/8/8/8/8/8
clk is 128
       1.5 nsec/call        1.6 user        0.0 sys: atoi
      76.5 nsec/call       76.5 user        0.0 sys: snprintf
     153.5 nsec/call      153.5 user        0.0 sys: snprintf_float
     138.0 nsec/call      138.0 user        0.0 sys: fnmatch
      21.1 nsec/call       21.1 user        0.0 sys: condvar_signal
      15.8 nsec/call       15.8 user        0.0 sys: mutex_lock_unlock
       6.1 nsec/call        6.1 user        0.0 sys: pthread_mutex_trylock
      27.7 nsec/call       27.7 user        0.0 sys: gettimeofday
     197.0 nsec/call      197.0 user        0.0 sys: strncpy
       5.6 nsec/call        5.6 user        0.0 sys: strchr
     139.7 nsec/call       13.3 user      125.4 sys: getrusage
      75.9 nsec/call       18.3 user       57.7 sys: read
     116.1 nsec/call       33.3 user       82.7 sys: read1bdevzero
     214.8 nsec/call       30.5 user      184.3 sys: read8kdevzero
      55.8 usec/call      298.6 user    55527.9 sys: read2mdevzero
       4.5 nsec/call        4.5 user        0.0 sys: rand
       2.8 nsec/call        2.8 user        0.0 sys: random
       5.2 nsec/call        5.2 user        0.0 sys: floatrand
    5864.5 nsec/call     5874.8 user        0.0 sys: cpp_testhrow_throw_48
    5469.4 nsec/call     5466.5 user        0.0 sys: cpp_testhrow_throw_24
    5297.6 nsec/call     5296.7 user        0.0 sys: cpp_testhrow_throw_12
    5180.9 nsec/call     5172.3 user        2.7 sys: cpp_testhrow_throw_4
    5130.7 nsec/call     5138.3 user        0.0 sys: cpp_testhrow_throw
       5.9 nsec/call        5.9 user        0.0 sys: cpp_testhrow_no_throw
       4.9 nsec/call        4.9 user        0.0 sys: cpp_testhrow_no_possible_throw
       2.2 nsec/call        2.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_possible_throw
    9060.3 usec/call  9062237.3 user        0.0 sys: prepare_qsort_1m
   15571.7 usec/call 15564085.7 user        0.0 sys: qsort_1m
   15593.5 usec/call 15581454.5 user        0.0 sys: qsort_1m2
   15815.9 usec/call 15806735.3 user        0.0 sys: qsort_1m3
       2.5 nsec/call        2.5 user        0.0 sys: hash
Hash 3EFA4189 -> B04FD36C
Size of mapped area for protect/segv tests: 8192 MB, 262144 cards
no touch by default
    1104.6 nsec/call       15.4 user     1088.1 sys: mprotect_randloc
     161.8 nsec/call       26.4 user      135.4 sys: mprotect_sameloc
     699.8 nsec/call       55.8 user      643.9 sys: mmap_no_touch
  315830.5 usec/call 20351500.0 user 295478500.0 sys: mmap_and_touch
    4956.8 nsec/call      756.6 user     4200.2 sys: trigger_segfaults
  (98307 segfaults, 105050 writes, watch collision ratio)
     164.9 nsec/call       22.8 user      142.1 sys: madvise_randloc
    1091.9 nsec/call        0.0 user     1100.2 sys: mprotect_randloc
with touch by default
      13.4 usec/call     1535.4 user    11826.9 sys: mprotect_randloc
     163.2 nsec/call       27.2 user      136.0 sys: mprotect_sameloc
     780.6 nsec/call       72.9 user      707.7 sys: mmap_no_touch
  316058.5 usec/call 25682500.0 user 290375500.0 sys: mmap_and_touch
    9086.7 nsec/call     1075.5 user     8008.4 sys: trigger_segfaults
  (54822 segfaults, 57978 writes, watch collision ratio)
     781.9 nsec/call       46.2 user      735.7 sys: madvise_randloc
      15.9 usec/call     1041.1 user    14817.0 sys: mprotect_randloc
All mprotect calls double:
      11.3 usec/call     1211.6 user    10099.8 sys: mprotect_randloc
     270.1 nsec/call       17.4 user      252.7 sys: mprotect_sameloc
     785.6 nsec/call       59.5 user      726.1 sys: mmap_no_touch
  316539.5 usec/call 34157000.0 user 282382000.0 sys: mmap_and_touch
    9741.1 nsec/call     1524.7 user     8216.5 sys: trigger_segfaults
  (50060 segfaults, 52931 writes, watch collision ratio)
     783.7 nsec/call       49.7 user      733.9 sys: madvise_randloc
      14.6 usec/call     1506.1 user    13096.8 sys: mprotect_randloc
All mprotect calls 10x:
      12.1 usec/call     1192.5 user    10926.6 sys: mprotect_randloc
    1020.3 nsec/call      192.7 user      827.6 sys: mprotect_sameloc
     791.7 nsec/call       32.3 user      759.4 sys: mmap_no_touch
  316685.0 usec/call 12573500.0 user 304111000.0 sys: mmap_and_touch
      12.5 usec/call     1440.2 user    11036.8 sys: trigger_segfaults
  (38056 segfaults, 40289 writes, watch collision ratio)
     781.3 nsec/call       89.8 user      691.5 sys: madvise_randloc
      12.9 usec/call     1148.7 user    11731.1 sys: mprotect_randloc
All mprotect calls single:
      11.2 usec/call     1100.8 user    10123.3 sys: mprotect_randloc
     163.5 nsec/call       17.7 user      145.8 sys: mprotect_sameloc
     792.9 nsec/call       58.4 user      734.5 sys: mmap_no_touch
  316458.0 usec/call 35992500.0 user 280464500.0 sys: mmap_and_touch
    9939.3 nsec/call     1540.0 user     8399.3 sys: trigger_segfaults
  (47776 segfaults, 50452 writes, watch collision ratio)
     783.6 nsec/call        0.0 user      784.8 sys: madvise_randloc
      13.9 usec/call     1273.5 user    12668.9 sys: mprotect_randloc

Linux Mint 22, kernel 6.8.0-52-generic:
Code:
FIXME: back to be changed pages with physical memory first
sizeof char/short/int/long/long_long/void*/size_t/off_t:
1/2/4/8/8/8/8/8
clk is 100
       1.2 nsec/call        1.2 user        0.0 sys: atoi
      49.4 nsec/call       49.4 user        0.0 sys: snprintf
     195.2 nsec/call      195.2 user        0.0 sys: snprintf_float
      24.2 nsec/call       24.2 user        0.0 sys: fnmatch
       6.2 nsec/call        6.2 user        0.0 sys: condvar_signal
       4.6 nsec/call        4.6 user        0.0 sys: mutex_lock_unlock
       5.4 nsec/call        5.4 user        0.0 sys: pthread_mutex_trylock
      21.5 nsec/call       21.5 user        0.0 sys: gettimeofday
      67.3 nsec/call       67.3 user        0.0 sys: strncpy
       3.6 nsec/call        3.6 user        0.0 sys: strchr
     567.8 nsec/call       80.4 user      487.4 sys: getrusage
     522.3 nsec/call       58.9 user      463.4 sys: read
     313.5 nsec/call       79.0 user      234.5 sys: read1bdevzero
     576.3 nsec/call       95.6 user      480.7 sys: read8kdevzero
      86.1 usec/call     5334.1 user    80733.4 sys: read2mdevzero
      10.0 nsec/call       10.0 user        0.0 sys: rand
       9.6 nsec/call        9.6 user        0.0 sys: random
      10.9 nsec/call       10.9 user        0.0 sys: floatrand
    1686.5 nsec/call     1686.5 user        0.0 sys: cpp_testhrow_throw_48
    1373.5 nsec/call     1373.4 user        0.0 sys: cpp_testhrow_throw_24
    1219.1 nsec/call     1219.1 user        0.0 sys: cpp_testhrow_throw_12
    1121.2 nsec/call     1121.1 user        0.0 sys: cpp_testhrow_throw_4
    1078.4 nsec/call     1078.5 user        0.0 sys: cpp_testhrow_throw
       5.3 nsec/call        5.3 user        0.0 sys: cpp_testhrow_no_throw
       4.4 nsec/call        4.4 user        0.0 sys: cpp_testhrow_no_possible_throw
       2.2 nsec/call        2.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_possible_throw
   31320.1 usec/call 30949937.5 user   368875.0 sys: prepare_qsort_1m
   54682.5 usec/call 54384500.0 user   296400.0 sys: qsort_1m
   57482.9 usec/call 57253000.0 user   226555.6 sys: qsort_1m2
   52062.5 usec/call 51868400.0 user   194100.0 sys: qsort_1m3
       2.4 nsec/call        2.4 user        0.0 sys: hash
Hash AE22D42 -> 9E235462
Size of mapped area for protect/segv tests: 8192 MB, 262144 cards
no touch by default
    5118.9 nsec/call        0.0 user     4954.3 sys: mprotect_randloc
    1538.9 nsec/call       88.4 user     1450.6 sys: mprotect_sameloc
      10.8 usec/call      199.8 user    10571.4 sys: mmap_no_touch
  571765.9 usec/call 22855000.0 user 548756000.0 sys: mmap_and_touch
cpu  8523793 322766 3892210 28179108082 662240 0 420825 0 0 0
      12.8 usec/call      194.6 user    12130.3 sys: trigger_segfaults
  (37052 segfaults, 39210 writes, watch collision ratio)
cpu  8523795 322766 3892258 28179108833 662240 0 420829 0 0 0
     476.9 nsec/call       94.6 user      381.0 sys: madvise_randloc
    5760.9 nsec/call        0.0 user     5584.8 sys: mprotect_randloc
with touch by default
      26.3 usec/call     1100.9 user    24832.2 sys: mprotect_randloc
    1901.6 nsec/call       34.1 user     1826.9 sys: mprotect_sameloc
      13.5 usec/call        0.0 user    13086.8 sys: mmap_no_touch
  573307.0 usec/call 18374000.0 user 554773000.0 sys: mmap_and_touch
cpu  8523827 322766 3892783 28179117223 662241 0 420840 0 0 0
      28.0 usec/call      862.3 user    26784.7 sys: trigger_segfaults
  (32769 segfaults, 34991 writes, watch collision ratio)
cpu  8523831 322766 3892877 28179118696 662241 0 420843 0 0 0
    1274.0 nsec/call      101.6 user     1172.5 sys: madvise_randloc
      26.5 usec/call     1128.1 user    25068.1 sys: mprotect_randloc
All mprotect calls double:
      28.1 usec/call      822.4 user    26878.9 sys: mprotect_randloc
    4374.5 nsec/call       73.1 user     3984.5 sys: mprotect_sameloc
      13.5 usec/call      150.5 user    12961.7 sys: mmap_no_touch
  572773.9 usec/call 27866000.0 user 544265000.0 sys: mmap_and_touch
cpu  8523864 322766 3893559 28179129439 662243 0 420849 0 0 0
      29.5 usec/call     1172.9 user    27899.0 sys: trigger_segfaults
  (32769 segfaults, 34951 writes, watch collision ratio)
cpu  8523869 322766 3893657 28179130985 662243 0 420853 0 0 0
    1272.2 nsec/call      109.2 user     1162.9 sys: madvise_randloc
      28.1 usec/call     1088.3 user    26567.1 sys: mprotect_randloc
All mprotect calls 10x:
      16.5 usec/call     1013.4 user    15169.7 sys: mprotect_randloc
      12.5 usec/call      853.9 user    11271.2 sys: mprotect_sameloc
      13.5 usec/call        0.0 user    13098.8 sys: mmap_no_touch
  575168.1 usec/call 28247000.0 user 546157000.0 sys: mmap_and_touch
cpu  8523905 322766 3894329 28179141577 662245 0 420858 0 0 0
     253.0 usec/call    12168.8 user   240209.8 sys: trigger_segfaults
  (2523 segfaults, 2536 writes, watch collision ratio)
cpu  8523908 322766 3894390 28179142542 662245 0 420859 0 0 0
    1267.8 nsec/call       75.8 user     1192.1 sys: madvise_randloc
      16.5 usec/call     1250.2 user    14886.8 sys: mprotect_randloc
All mprotect calls single:
     243.2 usec/call    12166.8 user   230083.2 sys: mprotect_randloc
    1903.0 nsec/call      103.0 user     1735.5 sys: mprotect_sameloc
      13.5 usec/call      140.6 user    13006.6 sys: mmap_no_touch
  571947.1 usec/call 31660000.0 user 539459000.0 sys: mmap_and_touch
cpu  8523944 322766 3895010 28179152378 662246 0 420863 0 0 0
      28.0 usec/call     1200.6 user    26470.6 sys: trigger_segfaults
  (32769 segfaults, 35012 writes, watch collision ratio)
cpu  8523949 322766 3895103 28179153850 662246 0 420867 0 0 0
    1270.3 nsec/call      108.3 user     1161.6 sys: madvise_randloc
      26.7 usec/call     1082.3 user    25271.0 sys: mprotect_randloc

Code on https://github.com/cracauer/ulmbenchmarks/
 
Traditionally Linux is faster in userland functions such as string handling (due to their use of SIMD), faster in threading primitives, and system calls about equal.

Now FreeBSD has very fast minimal system call time. Look for getrusage(2), read(2) etc.

FreeBSD-15-PRERELEASE:
Code:
FIXME: back to be changed pages with physical memory first
sizeof char/short/int/long/long_long/void*/size_t/off_t:
1/2/4/8/8/8/8/8
clk is 128
       1.5 nsec/call        1.6 user        0.0 sys: atoi
      76.5 nsec/call       76.5 user        0.0 sys: snprintf
     153.5 nsec/call      153.5 user        0.0 sys: snprintf_float
     138.0 nsec/call      138.0 user        0.0 sys: fnmatch
      21.1 nsec/call       21.1 user        0.0 sys: condvar_signal
      15.8 nsec/call       15.8 user        0.0 sys: mutex_lock_unlock
       6.1 nsec/call        6.1 user        0.0 sys: pthread_mutex_trylock
      27.7 nsec/call       27.7 user        0.0 sys: gettimeofday
     197.0 nsec/call      197.0 user        0.0 sys: strncpy
       5.6 nsec/call        5.6 user        0.0 sys: strchr
     139.7 nsec/call       13.3 user      125.4 sys: getrusage
      75.9 nsec/call       18.3 user       57.7 sys: read
     116.1 nsec/call       33.3 user       82.7 sys: read1bdevzero
     214.8 nsec/call       30.5 user      184.3 sys: read8kdevzero
      55.8 usec/call      298.6 user    55527.9 sys: read2mdevzero
       4.5 nsec/call        4.5 user        0.0 sys: rand
       2.8 nsec/call        2.8 user        0.0 sys: random
       5.2 nsec/call        5.2 user        0.0 sys: floatrand
    5864.5 nsec/call     5874.8 user        0.0 sys: cpp_testhrow_throw_48
    5469.4 nsec/call     5466.5 user        0.0 sys: cpp_testhrow_throw_24
    5297.6 nsec/call     5296.7 user        0.0 sys: cpp_testhrow_throw_12
    5180.9 nsec/call     5172.3 user        2.7 sys: cpp_testhrow_throw_4
    5130.7 nsec/call     5138.3 user        0.0 sys: cpp_testhrow_throw
       5.9 nsec/call        5.9 user        0.0 sys: cpp_testhrow_no_throw
       4.9 nsec/call        4.9 user        0.0 sys: cpp_testhrow_no_possible_throw
       2.2 nsec/call        2.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_possible_throw
    9060.3 usec/call  9062237.3 user        0.0 sys: prepare_qsort_1m
   15571.7 usec/call 15564085.7 user        0.0 sys: qsort_1m
   15593.5 usec/call 15581454.5 user        0.0 sys: qsort_1m2
   15815.9 usec/call 15806735.3 user        0.0 sys: qsort_1m3
       2.5 nsec/call        2.5 user        0.0 sys: hash
Hash 3EFA4189 -> B04FD36C
Size of mapped area for protect/segv tests: 8192 MB, 262144 cards
no touch by default
    1104.6 nsec/call       15.4 user     1088.1 sys: mprotect_randloc
     161.8 nsec/call       26.4 user      135.4 sys: mprotect_sameloc
     699.8 nsec/call       55.8 user      643.9 sys: mmap_no_touch
  315830.5 usec/call 20351500.0 user 295478500.0 sys: mmap_and_touch
    4956.8 nsec/call      756.6 user     4200.2 sys: trigger_segfaults
  (98307 segfaults, 105050 writes, watch collision ratio)
     164.9 nsec/call       22.8 user      142.1 sys: madvise_randloc
    1091.9 nsec/call        0.0 user     1100.2 sys: mprotect_randloc
with touch by default
      13.4 usec/call     1535.4 user    11826.9 sys: mprotect_randloc
     163.2 nsec/call       27.2 user      136.0 sys: mprotect_sameloc
     780.6 nsec/call       72.9 user      707.7 sys: mmap_no_touch
  316058.5 usec/call 25682500.0 user 290375500.0 sys: mmap_and_touch
    9086.7 nsec/call     1075.5 user     8008.4 sys: trigger_segfaults
  (54822 segfaults, 57978 writes, watch collision ratio)
     781.9 nsec/call       46.2 user      735.7 sys: madvise_randloc
      15.9 usec/call     1041.1 user    14817.0 sys: mprotect_randloc
All mprotect calls double:
      11.3 usec/call     1211.6 user    10099.8 sys: mprotect_randloc
     270.1 nsec/call       17.4 user      252.7 sys: mprotect_sameloc
     785.6 nsec/call       59.5 user      726.1 sys: mmap_no_touch
  316539.5 usec/call 34157000.0 user 282382000.0 sys: mmap_and_touch
    9741.1 nsec/call     1524.7 user     8216.5 sys: trigger_segfaults
  (50060 segfaults, 52931 writes, watch collision ratio)
     783.7 nsec/call       49.7 user      733.9 sys: madvise_randloc
      14.6 usec/call     1506.1 user    13096.8 sys: mprotect_randloc
All mprotect calls 10x:
      12.1 usec/call     1192.5 user    10926.6 sys: mprotect_randloc
    1020.3 nsec/call      192.7 user      827.6 sys: mprotect_sameloc
     791.7 nsec/call       32.3 user      759.4 sys: mmap_no_touch
  316685.0 usec/call 12573500.0 user 304111000.0 sys: mmap_and_touch
      12.5 usec/call     1440.2 user    11036.8 sys: trigger_segfaults
  (38056 segfaults, 40289 writes, watch collision ratio)
     781.3 nsec/call       89.8 user      691.5 sys: madvise_randloc
      12.9 usec/call     1148.7 user    11731.1 sys: mprotect_randloc
All mprotect calls single:
      11.2 usec/call     1100.8 user    10123.3 sys: mprotect_randloc
     163.5 nsec/call       17.7 user      145.8 sys: mprotect_sameloc
     792.9 nsec/call       58.4 user      734.5 sys: mmap_no_touch
  316458.0 usec/call 35992500.0 user 280464500.0 sys: mmap_and_touch
    9939.3 nsec/call     1540.0 user     8399.3 sys: trigger_segfaults
  (47776 segfaults, 50452 writes, watch collision ratio)
     783.6 nsec/call        0.0 user      784.8 sys: madvise_randloc
      13.9 usec/call     1273.5 user    12668.9 sys: mprotect_randloc

Linux Mint 22, kernel 6.8.0-52-generic:
Code:
FIXME: back to be changed pages with physical memory first
sizeof char/short/int/long/long_long/void*/size_t/off_t:
1/2/4/8/8/8/8/8
clk is 100
       1.2 nsec/call        1.2 user        0.0 sys: atoi
      49.4 nsec/call       49.4 user        0.0 sys: snprintf
     195.2 nsec/call      195.2 user        0.0 sys: snprintf_float
      24.2 nsec/call       24.2 user        0.0 sys: fnmatch
       6.2 nsec/call        6.2 user        0.0 sys: condvar_signal
       4.6 nsec/call        4.6 user        0.0 sys: mutex_lock_unlock
       5.4 nsec/call        5.4 user        0.0 sys: pthread_mutex_trylock
      21.5 nsec/call       21.5 user        0.0 sys: gettimeofday
      67.3 nsec/call       67.3 user        0.0 sys: strncpy
       3.6 nsec/call        3.6 user        0.0 sys: strchr
     567.8 nsec/call       80.4 user      487.4 sys: getrusage
     522.3 nsec/call       58.9 user      463.4 sys: read
     313.5 nsec/call       79.0 user      234.5 sys: read1bdevzero
     576.3 nsec/call       95.6 user      480.7 sys: read8kdevzero
      86.1 usec/call     5334.1 user    80733.4 sys: read2mdevzero
      10.0 nsec/call       10.0 user        0.0 sys: rand
       9.6 nsec/call        9.6 user        0.0 sys: random
      10.9 nsec/call       10.9 user        0.0 sys: floatrand
    1686.5 nsec/call     1686.5 user        0.0 sys: cpp_testhrow_throw_48
    1373.5 nsec/call     1373.4 user        0.0 sys: cpp_testhrow_throw_24
    1219.1 nsec/call     1219.1 user        0.0 sys: cpp_testhrow_throw_12
    1121.2 nsec/call     1121.1 user        0.0 sys: cpp_testhrow_throw_4
    1078.4 nsec/call     1078.5 user        0.0 sys: cpp_testhrow_throw
       5.3 nsec/call        5.3 user        0.0 sys: cpp_testhrow_no_throw
       4.4 nsec/call        4.4 user        0.0 sys: cpp_testhrow_no_possible_throw
       2.2 nsec/call        2.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_possible_throw
   31320.1 usec/call 30949937.5 user   368875.0 sys: prepare_qsort_1m
   54682.5 usec/call 54384500.0 user   296400.0 sys: qsort_1m
   57482.9 usec/call 57253000.0 user   226555.6 sys: qsort_1m2
   52062.5 usec/call 51868400.0 user   194100.0 sys: qsort_1m3
       2.4 nsec/call        2.4 user        0.0 sys: hash
Hash AE22D42 -> 9E235462
Size of mapped area for protect/segv tests: 8192 MB, 262144 cards
no touch by default
    5118.9 nsec/call        0.0 user     4954.3 sys: mprotect_randloc
    1538.9 nsec/call       88.4 user     1450.6 sys: mprotect_sameloc
      10.8 usec/call      199.8 user    10571.4 sys: mmap_no_touch
  571765.9 usec/call 22855000.0 user 548756000.0 sys: mmap_and_touch
cpu  8523793 322766 3892210 28179108082 662240 0 420825 0 0 0
      12.8 usec/call      194.6 user    12130.3 sys: trigger_segfaults
  (37052 segfaults, 39210 writes, watch collision ratio)
cpu  8523795 322766 3892258 28179108833 662240 0 420829 0 0 0
     476.9 nsec/call       94.6 user      381.0 sys: madvise_randloc
    5760.9 nsec/call        0.0 user     5584.8 sys: mprotect_randloc
with touch by default
      26.3 usec/call     1100.9 user    24832.2 sys: mprotect_randloc
    1901.6 nsec/call       34.1 user     1826.9 sys: mprotect_sameloc
      13.5 usec/call        0.0 user    13086.8 sys: mmap_no_touch
  573307.0 usec/call 18374000.0 user 554773000.0 sys: mmap_and_touch
cpu  8523827 322766 3892783 28179117223 662241 0 420840 0 0 0
      28.0 usec/call      862.3 user    26784.7 sys: trigger_segfaults
  (32769 segfaults, 34991 writes, watch collision ratio)
cpu  8523831 322766 3892877 28179118696 662241 0 420843 0 0 0
    1274.0 nsec/call      101.6 user     1172.5 sys: madvise_randloc
      26.5 usec/call     1128.1 user    25068.1 sys: mprotect_randloc
All mprotect calls double:
      28.1 usec/call      822.4 user    26878.9 sys: mprotect_randloc
    4374.5 nsec/call       73.1 user     3984.5 sys: mprotect_sameloc
      13.5 usec/call      150.5 user    12961.7 sys: mmap_no_touch
  572773.9 usec/call 27866000.0 user 544265000.0 sys: mmap_and_touch
cpu  8523864 322766 3893559 28179129439 662243 0 420849 0 0 0
      29.5 usec/call     1172.9 user    27899.0 sys: trigger_segfaults
  (32769 segfaults, 34951 writes, watch collision ratio)
cpu  8523869 322766 3893657 28179130985 662243 0 420853 0 0 0
    1272.2 nsec/call      109.2 user     1162.9 sys: madvise_randloc
      28.1 usec/call     1088.3 user    26567.1 sys: mprotect_randloc
All mprotect calls 10x:
      16.5 usec/call     1013.4 user    15169.7 sys: mprotect_randloc
      12.5 usec/call      853.9 user    11271.2 sys: mprotect_sameloc
      13.5 usec/call        0.0 user    13098.8 sys: mmap_no_touch
  575168.1 usec/call 28247000.0 user 546157000.0 sys: mmap_and_touch
cpu  8523905 322766 3894329 28179141577 662245 0 420858 0 0 0
     253.0 usec/call    12168.8 user   240209.8 sys: trigger_segfaults
  (2523 segfaults, 2536 writes, watch collision ratio)
cpu  8523908 322766 3894390 28179142542 662245 0 420859 0 0 0
    1267.8 nsec/call       75.8 user     1192.1 sys: madvise_randloc
      16.5 usec/call     1250.2 user    14886.8 sys: mprotect_randloc
All mprotect calls single:
     243.2 usec/call    12166.8 user   230083.2 sys: mprotect_randloc
    1903.0 nsec/call      103.0 user     1735.5 sys: mprotect_sameloc
      13.5 usec/call      140.6 user    13006.6 sys: mmap_no_touch
  571947.1 usec/call 31660000.0 user 539459000.0 sys: mmap_and_touch
cpu  8523944 322766 3895010 28179152378 662246 0 420863 0 0 0
      28.0 usec/call     1200.6 user    26470.6 sys: trigger_segfaults
  (32769 segfaults, 35012 writes, watch collision ratio)
cpu  8523949 322766 3895103 28179153850 662246 0 420867 0 0 0
    1270.3 nsec/call      108.3 user     1161.6 sys: madvise_randloc
      26.7 usec/call     1082.3 user    25271.0 sys: mprotect_randloc

Code on https://github.com/cracauer/ulmbenchmarks/
Well, you're comparing the latest and greatest Freebsd version against a Linux kernel released one year and a half ago... Try the latest 6.16 series for a more reasonable comparison.
 
Most all programs (should) spend most of their time in usermode code. Syscall speed is not terribly important except for micro benchmarks!
 
Most all programs (should) spend most of their time in usermode code. Syscall speed is not terribly important except for micro benchmarks!

Also there are syscalls that use vdso. These are syscalls that can avoid switching from userland to kernel. Roughly speaking they stay in userland and just read some memory that is shared by the kernel and userland to get the result. Maybe some syscalls use vdso on one platform and a classic syscall on another?
 
Most all programs (should) spend most of their time in usermode code. Syscall speed is not terribly important except for micro benchmarks!

Hey, this is a useless microbenchmark. It's even in the name :)

But system calls do matter for a wide variety of applications. Just think of a webserver or a database system.

The surprising thing here is that a basic read(2) is faster. That's kind of an important system call.
 
Also there are syscalls that use vdso. These are syscalls that can avoid switching from userland to kernel. Roughly speaking they stay in userland and just read some memory that is shared by the kernel and userland to get the result. Maybe some syscalls use vdso on one platform and a classic syscall on another?

If I'm not mistaken this is why gettimeofday(2) is not much faster than "full" system calls.

However, you can't do that to gettimeofday(2) and read(2).
 
Since when does FreeBSD have faster syscalls than Linux?
You need to ask the other way round: Since when does Linux have slower system calls than the FreeBSD kernel? I’d be really astonished if FreeBSD developers somehow managed to accelerate e. g. read(2), but not surprised if any implementation – of any OS – became slower.​
Also there are syscalls that use vdso. […]
[man=7linux]vdso[/man] is a Linux thing, though. For x64 [man=2linux]clock_gettime[/man], [man=2linux]getcpu[/man], [man=2linux]gettimeofday[/man] and [man=2linux]time[/man] are available.​
 
Well, you're comparing the latest and greatest Freebsd version against a Linux kernel released one year and a half ago... Try the latest 6.16 series for a more reasonable comparison.

Code:
Linux-6.17.0-rc2

       1.3 nsec/call        1.3 user        0.0 sys: atoi
      51.2 nsec/call       51.2 user        0.0 sys: snprintf
     199.5 nsec/call      199.5 user        0.0 sys: snprintf_float
      25.3 nsec/call       25.3 user        0.0 sys: fnmatch
       6.3 nsec/call        6.3 user        0.0 sys: condvar_signal
       4.6 nsec/call        4.6 user        0.0 sys: mutex_lock_unlock
       5.6 nsec/call        5.6 user        0.0 sys: pthread_mutex_trylock
    1213.2 nsec/call       40.1 user     1173.0 sys: gettimeofday
      68.3 nsec/call       68.3 user        0.0 sys: strncpy
       4.1 nsec/call        4.1 user        0.0 sys: strchr
     566.6 nsec/call       52.0 user      514.5 sys: getrusage
     483.3 nsec/call       47.5 user      435.7 sys: read
     273.8 nsec/call       44.9 user      228.9 sys: read1bdevzero
     538.7 nsec/call       64.6 user      474.0 sys: read8kdevzero
      86.9 usec/call     6255.4 user    80664.5 sys: read2mdevzero
      10.1 nsec/call       10.1 user        0.0 sys: rand
       9.7 nsec/call        9.7 user        0.0 sys: random
      11.0 nsec/call       11.0 user        0.0 sys: floatrand
    1779.1 nsec/call     1723.9 user        2.9 sys: cpp_testhrow_throw_48
    1424.0 nsec/call     1424.0 user        0.0 sys: cpp_testhrow_throw_24
    1270.5 nsec/call     1270.4 user        0.0 sys: cpp_testhrow_throw_12
    1164.7 nsec/call     1164.6 user        0.0 sys: cpp_testhrow_throw_4
    1097.6 nsec/call     1097.5 user        0.0 sys: cpp_testhrow_throw
       5.6 nsec/call        5.6 user        0.0 sys: cpp_testhrow_no_throw
       4.4 nsec/call        4.4 user        0.0 sys: cpp_testhrow_no_possible_throw
       2.2 nsec/call        2.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_possible_throw
   31603.9 usec/call 31291750.0 user   307812.5 sys: prepare_qsort_1m
   56458.7 usec/call 55562555.6 user   891555.6 sys: qsort_1m
   59420.0 usec/call 58529777.8 user   884111.1 sys: qsort_1m2
   54061.5 usec/call 53940600.0 user   109800.0 sys: qsort_1m3
       2.4 nsec/call        2.4 user        0.0 sys: hash
Hash 6916809B -> 4C044B90
Size of mapped area for protect/segv tests: 8192 MB, 262144 cards
no touch by default
    4589.6 nsec/call       80.5 user     4506.0 sys: mprotect_randloc
    1135.7 nsec/call       99.6 user     1035.8 sys: mprotect_sameloc
    3989.3 nsec/call      127.6 user     3861.2 sys: mmap_no_touch
  536509.9 usec/call 23641000.0 user 512834000.0 sys: mmap_and_touch
cpu  2621 0 2983 123449 189 0 14 0 0 0
    9784.4 nsec/call      124.9 user     9269.4 sys: trigger_segfaults
  (48656 segfaults, 51105 writes, watch collision ratio)
cpu  2623 0 3031 124202 189 0 15 0 0 0
     432.4 nsec/call       88.2 user      344.1 sys: madvise_randloc
    4792.9 nsec/call       72.6 user     4708.6 sys: mprotect_randloc
with touch by default
      23.8 usec/call     1103.2 user    22665.5 sys: mprotect_randloc
    1577.6 nsec/call       60.7 user     1516.3 sys: mprotect_sameloc
    4775.5 nsec/call      111.6 user     4653.7 sys: mmap_no_touch
  535360.9 usec/call 13874000.0 user 521339000.0 sys: mmap_and_touch
cpu  2656 0 3538 132291 190 0 18 0 0 0
      25.8 usec/call      955.6 user    24515.5 sys: trigger_segfaults
  (32769 segfaults, 34990 writes, watch collision ratio)
cpu  2660 0 3624 133651 190 0 18 0 0 0
    1040.3 nsec/call       48.6 user      991.6 sys: madvise_randloc
      24.7 usec/call     1028.5 user    23546.6 sys: mprotect_randloc
All mprotect calls double:
      25.2 usec/call     1318.9 user    23898.1 sys: mprotect_randloc
    3581.1 nsec/call      129.8 user     3448.1 sys: mprotect_sameloc
    4775.4 nsec/call       94.3 user     4671.8 sys: mmap_no_touch
  534369.0 usec/call 27398000.0 user 506799000.0 sys: mmap_and_touch
cpu  2692 0 4275 143846 191 0 19 0 0 0
      26.9 usec/call     1385.6 user    25082.8 sys: trigger_segfaults
  (32769 segfaults, 34947 writes, watch collision ratio)
cpu  2697 0 4364 145258 191 0 19 0 0 0
    1030.9 nsec/call       72.5 user      957.7 sys: madvise_randloc
      26.2 usec/call     1145.3 user    25037.6 sys: mprotect_randloc
All mprotect calls 10x:
      33.4 usec/call     1765.5 user    31250.1 sys: mprotect_randloc
      12.9 usec/call      575.8 user    12154.2 sys: mprotect_sameloc
    4751.2 nsec/call      154.4 user     4594.0 sys: mmap_no_touch
  533764.1 usec/call 23240000.0 user 510452000.0 sys: mmap_and_touch
cpu  2735 0 5060 156222 192 0 21 0 0 0
      16.9 usec/call      646.5 user    15981.1 sys: trigger_segfaults
  (27894 segfaults, 29532 writes, watch collision ratio)
cpu  2737 0 5108 156976 192 0 21 0 0 0
    1036.0 nsec/call       75.1 user      960.7 sys: madvise_randloc
     132.2 usec/call     5273.4 user   126203.1 sys: mprotect_randloc
All mprotect calls single:
      24.1 usec/call     1106.4 user    22950.4 sys: mprotect_randloc
    1507.1 nsec/call       73.0 user     1433.4 sys: mprotect_sameloc
    4757.0 nsec/call      106.9 user     4648.0 sys: mmap_no_touch
  535339.1 usec/call 22038000.0 user 513141000.0 sys: mmap_and_touch
cpu  2771 0 5741 166959 197 0 22 0 0 0
      25.5 usec/call      970.4 user    24477.4 sys: trigger_segfaults
  (32769 segfaults, 35074 writes, watch collision ratio)
cpu  2774 0 5827 168301 197 0 22 0 0 0
    1035.1 nsec/call       59.8 user      975.1 sys: madvise_randloc
      24.6 usec/call     1322.0 user    23268.1 sys: mprotect_randloc
 
Linuxulator on 15-PRERELEASE:
Code:
      11.7 nsec/call       11.8 user        0.0 sys: atoi
      52.1 nsec/call       52.1 user        0.0 sys: snprintf
     229.2 nsec/call      229.2 user        0.0 sys: snprintf_float
      28.4 nsec/call       28.4 user        0.0 sys: fnmatch
       6.7 nsec/call        6.7 user        0.0 sys: condvar_signal
       5.0 nsec/call        5.0 user        0.0 sys: mutex_lock_unlock
       5.1 nsec/call        5.1 user        0.0 sys: pthread_mutex_trylock
      31.6 nsec/call       31.6 user        0.0 sys: gettimeofday
      65.8 nsec/call       65.8 user        0.0 sys: strncpy
       0.2 nsec/call        0.2 user        0.0 sys: strchr
     366.9 nsec/call      219.2 user      150.6 sys: getrusage
     291.4 nsec/call      209.7 user       77.9 sys: read
     327.5 nsec/call      186.4 user      141.0 sys: read1bdevzero
     427.5 nsec/call      186.9 user      240.6 sys: read8kdevzero
      52.1 usec/call      273.4 user    51824.0 sys: read2mdevzero
       9.1 nsec/call        9.1 user        0.0 sys: rand
       9.2 nsec/call        9.2 user        0.0 sys: random
      10.0 nsec/call       10.0 user        0.0 sys: floatrand
    1991.0 nsec/call     1957.3 user        0.0 sys: cpp_testhrow_throw_48
    1590.0 nsec/call     1591.9 user        0.0 sys: cpp_testhrow_throw_24
    1411.5 nsec/call     1410.3 user        0.0 sys: cpp_testhrow_throw_12
    1307.0 nsec/call     1306.0 user        0.0 sys: cpp_testhrow_throw_4
    1224.2 nsec/call     1225.4 user        0.0 sys: cpp_testhrow_throw
       2.4 nsec/call        2.4 user        0.0 sys: cpp_testhrow_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_possible_throw
       2.2 nsec/call        2.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_possible_throw
   29897.2 usec/call 29925388.9 user        0.0 sys: prepare_qsort_1m
   51832.0 usec/call 51804000.0 user        0.0 sys: qsort_1m
   51821.9 usec/call 51080818.2 user   676181.8 sys: qsort_1m2
   52177.6 usec/call 52185545.5 user        0.0 sys: qsort_1m3
       1.5 nsec/call        1.5 user        0.0 sys: hash
Hash 20E11A6F -> 4F4E95DC
Size of mapped area for protect/segv tests: 8192 MB, 262144 cards
no touch by default
    1265.4 nsec/call      248.0 user     1016.4 sys: mprotect_randloc
     392.2 nsec/call      274.9 user      117.3 sys: mprotect_sameloc
    3423.2 nsec/call      477.2 user     2946.0 sys: mmap_no_touch
  293799.0 usec/call 45946000.0 user 247853500.0 sys: mmap_and_touch
cpu 5535 0 5077 29467297 0 44 0 0 0 0
    4940.1 nsec/call      919.5 user     4020.7 sys: trigger_segfaults
  (100864 segfaults, 107540 writes, watch collision ratio)
cpu 5545 0 5121 29468077 0 44 0 0 0 0
     325.5 nsec/call      221.8 user      101.7 sys: madvise_randloc
    1263.9 nsec/call      254.3 user     1009.5 sys: mprotect_randloc
with touch by default
      16.4 usec/call     2777.6 user    13653.4 sys: mprotect_randloc
     394.5 nsec/call      173.1 user      221.5 sys: mprotect_sameloc
    3913.0 nsec/call      267.5 user     3645.5 sys: mmap_no_touch
  308124.4 usec/call 28358500.0 user 279766000.0 sys: mmap_and_touch
cpu 5647 0 5462 29474457 0 44 0 0 0 0
    8001.0 nsec/call     1453.5 user     6547.5 sys: trigger_segfaults
  (61026 segfaults, 64920 writes, watch collision ratio)
cpu 5656 0 5505 29475533 0 44 0 0 0 0
     760.4 nsec/call      222.1 user      538.2 sys: madvise_randloc
      17.4 usec/call     1621.1 user    15804.4 sys: mprotect_randloc
All mprotect calls double:
      11.0 usec/call     1152.6 user     9886.2 sys: mprotect_randloc
     730.0 nsec/call      515.6 user      214.4 sys: mprotect_sameloc
    3975.6 nsec/call      368.3 user     3607.4 sys: mmap_no_touch
  280895.0 usec/call 40259500.0 user 240635500.0 sys: mmap_and_touch
cpu 5758 0 5925 29483074 0 44 0 0 0 0
      10.3 usec/call     1413.5 user     8844.1 sys: trigger_segfaults
  (48916 segfaults, 51793 writes, watch collision ratio)
cpu 5765 0 5970 29483965 0 44 0 0 0 0
     742.3 nsec/call      265.4 user      476.9 sys: madvise_randloc
      13.3 usec/call     1790.2 user    11500.1 sys: mprotect_randloc
All mprotect calls 10x:
      12.0 usec/call     2621.9 user     9411.0 sys: mprotect_randloc
    3308.5 nsec/call     2142.6 user     1165.9 sys: mprotect_sameloc
    3952.5 nsec/call      660.6 user     3291.9 sys: mmap_no_touch
  290463.5 usec/call 34980000.0 user 255483500.0 sys: mmap_and_touch
cpu 5876 0 6365 29491501 0 44 0 0 0 0
      17.6 usec/call     3722.3 user    13869.7 sys: trigger_segfaults
  (27814 segfaults, 28759 writes, watch collision ratio)
cpu 5887 0 6405 29492148 0 44 0 0 0 0
     740.1 nsec/call      293.0 user      447.0 sys: madvise_randloc
      10.3 usec/call     3229.9 user     7061.8 sys: mprotect_randloc
All mprotect calls single:
      15.8 usec/call     2737.3 user    13077.9 sys: mprotect_randloc
     393.4 nsec/call      277.9 user      115.5 sys: mprotect_sameloc
    3955.5 nsec/call      453.4 user     3502.1 sys: mmap_no_touch
  310225.5 usec/call 21351000.0 user 288875000.0 sys: mmap_and_touch
cpu 6007 0 6788 29499856 0 44 0 0 0 0
    8063.9 nsec/call     1926.3 user     6137.6 sys: trigger_segfaults
  (61435 segfaults, 65424 writes, watch collision ratio)
cpu 6019 0 6829 29500638 0 44 0 0 0 0
     737.2 nsec/call      199.0 user      538.2 sys: madvise_randloc
      18.6 usec/call     2582.3 user    16032.9 sys: mprotect_randloc
 
CPU vulnerability mitigations off on Linux-6.17-rc2:

Code:
FIXME: back to be changed pages with physical memory first
sizeof char/short/int/long/long_long/void*/size_t/off_t:
1/2/4/8/8/8/8/8
clk is 100
       1.2 nsec/call        1.2 user        0.0 sys: atoi
      51.6 nsec/call       51.6 user        0.0 sys: snprintf
     199.1 nsec/call      199.1 user        0.0 sys: snprintf_float
      31.1 nsec/call       31.1 user        0.0 sys: fnmatch
       6.4 nsec/call        6.4 user        0.0 sys: condvar_signal
       4.6 nsec/call        4.6 user        0.0 sys: mutex_lock_unlock
       5.5 nsec/call        5.5 user        0.0 sys: pthread_mutex_trylock
    1087.0 nsec/call       41.9 user     1045.1 sys: gettimeofday
      68.4 nsec/call       68.3 user        0.1 sys: strncpy
       4.1 nsec/call        4.1 user        0.0 sys: strchr
     200.5 nsec/call       29.3 user      171.3 sys: getrusage
     153.7 nsec/call       21.6 user      132.1 sys: read
     104.6 nsec/call       32.6 user       72.0 sys: read1bdevzero
     353.3 nsec/call       27.6 user      325.7 sys: read8kdevzero
      81.9 usec/call     6716.7 user    75165.6 sys: read2mdevzero
      10.1 nsec/call       10.1 user        0.0 sys: rand
       9.7 nsec/call        9.7 user        0.0 sys: random
      11.0 nsec/call       11.0 user        0.0 sys: floatrand
    1779.4 nsec/call     1727.2 user        0.0 sys: cpp_testhrow_throw_48
    1418.7 nsec/call     1418.5 user        0.0 sys: cpp_testhrow_throw_24
    1268.3 nsec/call     1268.0 user        0.0 sys: cpp_testhrow_throw_12
    1130.7 nsec/call     1130.7 user        0.0 sys: cpp_testhrow_throw_4
    1082.7 nsec/call     1082.6 user        0.0 sys: cpp_testhrow_throw
       5.6 nsec/call        5.6 user        0.0 sys: cpp_testhrow_no_throw
       4.4 nsec/call        4.4 user        0.0 sys: cpp_testhrow_no_possible_throw
       2.2 nsec/call        2.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_throw
       1.2 nsec/call        1.2 user        0.0 sys: cpp_testhrow_no_cleanup_no_possible_throw
   31401.6 usec/call 31150250.0 user   249750.0 sys: prepare_qsort_1m
   56389.1 usec/call 55945555.6 user   433555.6 sys: qsort_1m
   59118.8 usec/call 58745555.6 user   351555.6 sys: qsort_1m2
   53774.6 usec/call 53651400.0 user   111100.0 sys: qsort_1m3
       2.4 nsec/call        2.4 user        0.0 sys: hash
Hash 180C5C5A -> BC7B682E
Size of mapped area for protect/segv tests: 8192 MB, 262144 cards
no touch by default
    2955.8 nsec/call       65.5 user     2861.1 sys: mprotect_randloc
     523.1 nsec/call       38.2 user      480.5 sys: mprotect_sameloc
    1909.9 nsec/call       96.8 user     1813.1 sys: mmap_no_touch
  316324.5 usec/call 22303000.0 user 294011000.0 sys: mmap_and_touch
cpu  2179 0 2324 256705 229 0 19 0 0 0
    6477.5 nsec/call      324.2 user     6134.2 sys: trigger_segfaults
  (73046 segfaults, 77192 writes, watch collision ratio)
cpu  2182 0 2371 257457 229 0 19 0 0 0
     187.4 nsec/call       42.6 user      144.5 sys: madvise_randloc
    2825.4 nsec/call       60.9 user     2733.3 sys: mprotect_randloc
with touch by default
      21.1 usec/call     1492.3 user    19511.8 sys: mprotect_randloc
     685.1 nsec/call       42.2 user      642.2 sys: mprotect_sameloc
    2073.9 nsec/call       70.9 user     2002.7 sys: mmap_no_touch
  315013.6 usec/call 19957500.0 user 294839000.0 sys: mmap_and_touch
cpu  2221 0 2805 264550 230 0 21 0 0 0
      15.5 usec/call     1310.3 user    14174.2 sys: trigger_segfaults
  (32769 segfaults, 35044 writes, watch collision ratio)
cpu  2225 0 2855 265368 230 0 22 0 0 0
     415.4 nsec/call       40.8 user      374.5 sys: madvise_randloc
      15.7 usec/call     1024.2 user    14600.6 sys: mprotect_randloc
All mprotect calls double:
      15.4 usec/call     1181.8 user    14176.8 sys: mprotect_randloc
    1634.1 nsec/call       62.3 user     1571.4 sys: mprotect_sameloc
    2076.9 nsec/call       88.7 user     1987.9 sys: mmap_no_touch
  314815.6 usec/call 28917500.0 user 285801500.0 sys: mmap_and_touch
cpu  2266 0 3315 272883 232 0 22 0 0 0
      16.1 usec/call     1191.5 user    14908.0 sys: trigger_segfaults
  (32769 segfaults, 35051 writes, watch collision ratio)
cpu  2270 0 3368 273733 232 0 23 0 0 0
     414.5 nsec/call       46.5 user      368.0 sys: madvise_randloc
      16.4 usec/call     1152.6 user    15244.2 sys: mprotect_randloc
All mprotect calls 10x:
      19.4 usec/call     1566.9 user    17790.7 sys: mprotect_randloc
    4985.2 nsec/call      229.8 user     4709.5 sys: mprotect_sameloc
    2077.2 nsec/call       75.4 user     2001.8 sys: mmap_no_touch
  314264.0 usec/call 30441500.0 user 283765500.0 sys: mmap_and_touch
cpu  2312 0 3852 281624 233 0 23 0 0 0
      19.9 usec/call     1147.5 user    18505.4 sys: trigger_segfaults
  (32769 segfaults, 34943 writes, watch collision ratio)
cpu  2316 0 3917 282667 233 0 23 0 0 0
     413.6 nsec/call       43.9 user      369.5 sys: madvise_randloc
      20.0 usec/call     1676.8 user    18294.9 sys: mprotect_randloc
All mprotect calls single:
      12.7 usec/call      862.6 user    11847.1 sys: mprotect_randloc
     687.3 nsec/call       35.7 user      650.9 sys: mprotect_sameloc
    2068.6 nsec/call       79.2 user     1989.3 sys: mmap_no_touch
  314906.0 usec/call 24519000.0 user 290327000.0 sys: mmap_and_touch
cpu  2357 0 4392 290398 235 0 24 0 0 0
      17.7 usec/call     1273.8 user    16416.1 sys: trigger_segfaults
  (26841 segfaults, 28243 writes, watch collision ratio)
cpu  2360 0 4438 291151 235 0 24 0 0 0
     409.9 nsec/call       50.1 user      359.8 sys: madvise_randloc
      16.0 usec/call     1238.9 user    14746.2 sys: mprotect_randloc
 
I disagree that user space calls are more important than system calls. For the programming I personally do system call performance is one of the most important metrics that I look at. A fast read(2), write(2), poll(2), etc are critical for all kinds of reasons (performance, throughput, machine utilization, etc).

These are excellent numbers ! - Thank you. FreeBSD 15 looks excellent at performing system calls and I am looking forward to the 15.x-RELEASE.
 
I compiled a 127,662 line C program with cc (it's a compiler for the V language, self generated from v code). It took about 6.65 seconds. In this time it made 1930 syscalls. Time spent in system code: 0.12s, in user code: 6.54s. Looking at syscalls called > 9 times:
334 mmap
228 _umtx_op
181 fstat
177 close
147 openat
129 sigprocmask
104 pread
103 __realpathat
67 open
63 sigaction
60 mprotect
53 write
53 access
46 munmap
37 fstatat
14 sigfastblock
12 read
Most of the system time was spent in doing real work, not in just crossing the user mode/kernel mode boundary twice.

Compiling the same code with tcc, system: 0.02s, user: 0.31s total: 0.32s, and it made 483 calls. Looking at syscalls called > 9 times:
249 read
86 lseek
38 openat
27 mmap
27 close
Now granted that tcc doesn't generate as efficient code but still, a lot of clang's slowness seems self inflicted!

In any case, it is not that syscalls are not important. It is that its speed is not all that critical for most programs. Kernel efficiency matters but that doesn't directly depend on syscalls as much as it does on kernel arch., algorithms etc.

Here is a better answer from Terry Lambert (old FreeBSD hands would know that name!): https://www.quora.com/Which-OS-is-faster-Arch-Linux-or-FreeBSD?topAns=83529986
 
I remember reading something about Fast gettimeofday(2) and clock_gettime(2) several years ago, and that being supported on FreeBSD on Azure. Not sure if that ever made it's way to other hypervisors like VMWare. It's certainly a noticeable problem when running www/firefox in a virtual machine and opening JavaScript heavy web apps like Slack or Jira.
 
Back
Top