Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@MagnusS
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MagnusS/089c06913594ebdf21b1 to your computer and use it in GitHub Desktop.
Save MagnusS/089c06913594ebdf21b1 to your computer and use it in GitHub Desktop.
Mirage pause/sleep benchmark
open Mirage
let main = foreign "Unikernel.Main" (console @-> job)
let platform =
match get_mode () with
| `Xen -> "xen"
| _ -> "unix"
let () =
add_to_opam_packages [
"mirage-clock-" ^ platform ];
add_to_ocamlfind_libraries [
"mirage-clock-" ^ platform ];
register "unikernel" [
main $ default_console
]

Cubieboard

Unix

./mir-unikernel
Starting...
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 206213, calls/sec 206082.549473
Tick 2/10, pause_counter 207534, calls/sec 207337.207059
Tick 3/10, pause_counter 206056, calls/sec 205860.020152
Tick 4/10, pause_counter 206608, calls/sec 206417.936030
Tick 5/10, pause_counter 206918, calls/sec 206722.628253
Tick 6/10, pause_counter 206740, calls/sec 206527.086696
Tick 7/10, pause_counter 206504, calls/sec 206318.503890
Tick 8/10, pause_counter 206626, calls/sec 206436.263682
Tick 9/10, pause_counter 206436, calls/sec 206237.202533
Tick 10/10, pause_counter 206478, calls/sec 206367.591009
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 89672, calls/sec 89625.566466
Tick 2/10, sleep_counter 89667, calls/sec 89621.209744
Tick 3/10, sleep_counter 89780, calls/sec 89733.425010
Tick 4/10, sleep_counter 89503, calls/sec 89455.950519
Tick 5/10, sleep_counter 89678, calls/sec 89631.755589
Tick 6/10, sleep_counter 89714, calls/sec 89666.561831
Tick 7/10, sleep_counter 89815, calls/sec 89767.422862
Tick 8/10, sleep_counter 89590, calls/sec 89542.264666
Tick 9/10, sleep_counter 89580, calls/sec 89531.309939
Tick 10/10, sleep_counter 89708, calls/sec 89660.650466

Unix w/ patch

Starting...
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 207273, calls/sec 207025.367432
Tick 2/10, pause_counter 208470, calls/sec 208107.302308
Tick 3/10, pause_counter 207292, calls/sec 207176.811324
Tick 4/10, pause_counter 207418, calls/sec 207301.703969
Tick 5/10, pause_counter 207090, calls/sec 206982.371046
Tick 6/10, pause_counter 206892, calls/sec 206783.636268
Tick 7/10, pause_counter 206952, calls/sec 206843.999159
Tick 8/10, pause_counter 206884, calls/sec 206776.281014
Tick 9/10, pause_counter 207064, calls/sec 206954.510545
Tick 10/10, pause_counter 206830, calls/sec 206708.073746
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 90605, calls/sec 90554.932840
Tick 2/10, sleep_counter 90597, calls/sec 90549.267544
Tick 3/10, sleep_counter 90828, calls/sec 90770.823287
Tick 4/10, sleep_counter 90565, calls/sec 90518.190337
Tick 5/10, sleep_counter 90575, calls/sec 90526.675123
Tick 6/10, sleep_counter 90596, calls/sec 90547.275539
Tick 7/10, sleep_counter 90633, calls/sec 90584.277225
Tick 8/10, sleep_counter 90566, calls/sec 90511.231079
Tick 9/10, sleep_counter 90722, calls/sec 90677.745376
Tick 10/10, sleep_counter 90527, calls/sec 90481.589904

Xen

Starting...
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 5, calls/sec 4.999170
Tick 2/10, pause_counter 3, calls/sec 2.999364
Tick 3/10, pause_counter 3, calls/sec 2.999400
Tick 4/10, pause_counter 3, calls/sec 2.999421
Tick 5/10, pause_counter 3, calls/sec 2.999370
Tick 6/10, pause_counter 3, calls/sec 2.999319
Tick 7/10, pause_counter 5, calls/sec 4.998890
Tick 8/10, pause_counter 3, calls/sec 2.999316
Tick 9/10, pause_counter 3, calls/sec 2.999334
Tick 10/10, pause_counter 3, calls/sec 2.999256
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 187335, calls/sec 187307.840363
Tick 2/10, sleep_counter 188448, calls/sec 188407.680756
Tick 3/10, sleep_counter 188620, calls/sec 188581.152283
Tick 4/10, sleep_counter 188264, calls/sec 188226.166541
Tick 5/10, sleep_counter 190985, calls/sec 190946.619729
Tick 6/10, sleep_counter 191206, calls/sec 191162.032732
Tick 7/10, sleep_counter 188557, calls/sec 188513.076453
Tick 8/10, sleep_counter 187114, calls/sec 187074.527275
Tick 9/10, sleep_counter 187013, calls/sec 186972.426983
Tick 10/10, sleep_counter 188829, calls/sec 188784.635611

Xen w/patch

Starting...
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 189722, calls/sec 189704.926557
Tick 2/10, pause_counter 190174, calls/sec 190130.079952
Tick 3/10, pause_counter 190661, calls/sec 190616.205192
Tick 4/10, pause_counter 195048, calls/sec 195001.784577
Tick 5/10, pause_counter 200372, calls/sec 200324.923643
Tick 6/10, pause_counter 199875, calls/sec 199831.436747
Tick 7/10, pause_counter 198316, calls/sec 198269.010245
Tick 8/10, pause_counter 186615, calls/sec 186572.088420
Tick 9/10, pause_counter 187010, calls/sec 186966.249898
Tick 10/10, pause_counter 187020, calls/sec 186975.499831
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 216538, calls/sec 216490.372118
Tick 2/10, sleep_counter 216588, calls/sec 216539.062172
Tick 3/10, sleep_counter 215255, calls/sec 215206.363362
Tick 4/10, sleep_counter 218407, calls/sec 218356.123023
Tick 5/10, sleep_counter 217699, calls/sec 217646.982371
Tick 6/10, sleep_counter 216597, calls/sec 216547.410643
Tick 7/10, sleep_counter 215204, calls/sec 215154.084252
Tick 8/10, sleep_counter 216775, calls/sec 216727.319990
Tick 9/10, sleep_counter 214824, calls/sec 214774.172392
Tick 10/10, sleep_counter 217507, calls/sec 217456.550080

Unix Lwt_main.yield

./mir-unikernel
Starting...
Tick 0/10, yield_counter 0, calls/sec 0.000000
Tick 1/10, yield_counter 134777, calls/sec 134638.871942
Tick 2/10, yield_counter 136322, calls/sec 136256.735350
Tick 3/10, yield_counter 136224, calls/sec 136158.360455
Tick 4/10, yield_counter 136844, calls/sec 136777.246845
Tick 5/10, yield_counter 136733, calls/sec 136667.538583
Tick 6/10, yield_counter 137117, calls/sec 137049.460491
Tick 7/10, yield_counter 137140, calls/sec 137074.180403
Tick 8/10, yield_counter 137237, calls/sec 137162.243166
Tick 9/10, yield_counter 136552, calls/sec 136482.136884
Tick 10/10, yield_counter 136515, calls/sec 136448.667461

Unix w/libev

./mir-unikernel
Starting...
Tick 0/10, yield_counter 0, calls/sec 0.000000
Tick 1/10, yield_counter 175618, calls/sec 175502.889496
Tick 2/10, yield_counter 177205, calls/sec 177041.394204
Tick 3/10, yield_counter 178070, calls/sec 177908.816285
Tick 4/10, yield_counter 176058, calls/sec 175901.989515
Tick 5/10, yield_counter 176426, calls/sec 176265.758554
Tick 6/10, yield_counter 176332, calls/sec 176175.033290
Tick 7/10, yield_counter 176923, calls/sec 176758.265146
Tick 8/10, yield_counter 177901, calls/sec 177746.193185
Tick 9/10, yield_counter 177792, calls/sec 177634.241395
Tick 10/10, yield_counter 177791, calls/sec 177702.875253
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 256865, calls/sec 256739.761212
Tick 2/10, pause_counter 255716, calls/sec 255566.229790
Tick 3/10, pause_counter 255956, calls/sec 255829.070646
Tick 4/10, pause_counter 255416, calls/sec 255287.087539
Tick 5/10, pause_counter 255594, calls/sec 255462.684400
Tick 6/10, pause_counter 256344, calls/sec 256243.318459
Tick 7/10, pause_counter 256412, calls/sec 256276.416750
Tick 8/10, pause_counter 256598, calls/sec 256452.601792
Tick 9/10, pause_counter 256702, calls/sec 256562.717462
Tick 10/10, pause_counter 256698, calls/sec 256562.265521
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 901, calls/sec 900.105111
Tick 2/10, sleep_counter 899, calls/sec 898.418876
Tick 3/10, sleep_counter 899, calls/sec 898.826419
Tick 4/10, sleep_counter 900, calls/sec 899.255392
Tick 5/10, sleep_counter 899, calls/sec 898.922845
Tick 6/10, sleep_counter 900, calls/sec 899.363158
Tick 7/10, sleep_counter 900, calls/sec 899.123450
Tick 8/10, sleep_counter 900, calls/sec 899.167355
Tick 9/10, sleep_counter 900, calls/sec 899.340660
Tick 10/10, sleep_counter 900, calls/sec 899.159430

x86

Unix

Starting...
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 983915, calls/sec 983514.728670
Tick 2/10, pause_counter 986720, calls/sec 986604.504602
Tick 3/10, pause_counter 987748, calls/sec 987648.394614
Tick 4/10, pause_counter 987898, calls/sec 987798.144002
Tick 5/10, pause_counter 986160, calls/sec 986064.315906
Tick 6/10, pause_counter 986530, calls/sec 986428.401005
Tick 7/10, pause_counter 985760, calls/sec 985664.354717
Tick 8/10, pause_counter 987398, calls/sec 987299.371375
Tick 9/10, pause_counter 986394, calls/sec 986297.352687
Tick 10/10, pause_counter 985926, calls/sec 985823.523151
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 324459, calls/sec 324426.899999
Tick 2/10, sleep_counter 324576, calls/sec 324545.203713
Tick 3/10, sleep_counter 324644, calls/sec 324609.869676
Tick 4/10, sleep_counter 324111, calls/sec 324078.239100
Tick 5/10, sleep_counter 324975, calls/sec 324939.982778
Tick 6/10, sleep_counter 324765, calls/sec 324731.166611
Tick 7/10, sleep_counter 324562, calls/sec 324529.580344
Tick 8/10, sleep_counter 324934, calls/sec 324901.853005
Tick 9/10, sleep_counter 324806, calls/sec 324770.923566
Tick 10/10, sleep_counter 324524, calls/sec 324490.578500

Unix w/patch

Starting...
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 989439, calls/sec 989314.460140
Tick 2/10, pause_counter 988674, calls/sec 988551.206045
Tick 3/10, pause_counter 989430, calls/sec 989316.309991
Tick 4/10, pause_counter 989030, calls/sec 988914.234216
Tick 5/10, pause_counter 989118, calls/sec 989005.288921
Tick 6/10, pause_counter 989720, calls/sec 989603.209803
Tick 7/10, pause_counter 989122, calls/sec 988978.639144
Tick 8/10, pause_counter 989530, calls/sec 989415.355028
Tick 9/10, pause_counter 990232, calls/sec 990117.037661
Tick 10/10, pause_counter 989080, calls/sec 988965.171404
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 326276, calls/sec 326238.120541
Tick 2/10, sleep_counter 326053, calls/sec 326015.224150
Tick 3/10, sleep_counter 326165, calls/sec 326128.144126
Tick 4/10, sleep_counter 325978, calls/sec 325940.155138
Tick 5/10, sleep_counter 326404, calls/sec 326365.483261
Tick 6/10, sleep_counter 325791, calls/sec 325754.574673
Tick 7/10, sleep_counter 326135, calls/sec 326098.458472
Tick 8/10, sleep_counter 326027, calls/sec 325990.159720
Tick 9/10, sleep_counter 326112, calls/sec 326073.206787
Tick 10/10, sleep_counter 326214, calls/sec 326176.127739

Xen

Starting...
Tick 0/10, pause_counter 0, calls/sec nan
Tick 1/10, pause_counter 5, calls/sec 4.999660
Tick 2/10, pause_counter 4, calls/sec 3.999496
Tick 3/10, pause_counter 4, calls/sec 3.999453
Tick 4/10, pause_counter 4, calls/sec 3.999440
Tick 5/10, pause_counter 4, calls/sec 3.999439
Tick 6/10, pause_counter 4, calls/sec 3.999440
Tick 7/10, pause_counter 4, calls/sec 3.999440
Tick 8/10, pause_counter 4, calls/sec 3.999432
Tick 9/10, pause_counter 4, calls/sec 3.999440
Tick 10/10, pause_counter 4, calls/sec 3.999440
Tick 0/10, sleep_counter 0, calls/sec 0.000000
Tick 1/10, sleep_counter 2508587, calls/sec 2508471.573218
Tick 2/10, sleep_counter 2536105, calls/sec 2536059.651720
Tick 3/10, sleep_counter 2537483, calls/sec 2537442.466780
Tick 4/10, sleep_counter 2534444, calls/sec 2534398.077183
Tick 5/10, sleep_counter 2541983, calls/sec 2541937.546615
Tick 6/10, sleep_counter 2536048, calls/sec 2536004.466598
Tick 7/10, sleep_counter 2534857, calls/sec 2534814.091379
Tick 8/10, sleep_counter 2533341, calls/sec 2533298.117041
Tick 9/10, sleep_counter 2540800, calls/sec 2540759.413795
Tick 10/10, sleep_counter 2536632, calls/sec 2536586.037538

Xen w/patch

Starting...
Tick 0/10, pause_counter 0, calls/sec nan
Tick 1/10, pause_counter 2742096, calls/sec 2742048.929611
Tick 2/10, pause_counter 2743149, calls/sec 2743097.333576
Tick 3/10, pause_counter 2779123, calls/sec 2779075.294011
Tick 4/10, pause_counter 2761381, calls/sec 2761328.990181
Tick 5/10, pause_counter 2746284, calls/sec 2746234.238752
Tick 6/10, pause_counter 2788735, calls/sec 2788685.134424
Tick 7/10, pause_counter 2761601, calls/sec 2761548.327646
Tick 8/10, pause_counter 2743962, calls/sec 2743915.551768
Tick 9/10, pause_counter 2793043, calls/sec 2792992.391503
Tick 10/10, pause_counter 2764093, calls/sec 2764043.575049
Tick 0/10, sleep_counter 0, calls/sec nan
Tick 1/10, sleep_counter 2924881, calls/sec 2924839.857166
Tick 2/10, sleep_counter 2945803, calls/sec 2945755.944363
Tick 3/10, sleep_counter 2944562, calls/sec 2944500.221927
Tick 4/10, sleep_counter 2945034, calls/sec 2944977.829006
Tick 5/10, sleep_counter 2944856, calls/sec 2944808.959490
Tick 6/10, sleep_counter 2944487, calls/sec 2944437.157395
Tick 7/10, sleep_counter 2945540, calls/sec 2945489.437323
Tick 8/10, sleep_counter 2933646, calls/sec 2933596.340905
Tick 9/10, sleep_counter 2946565, calls/sec 2946517.932191
Tick 10/10, sleep_counter 2949806, calls/sec 2949756.067358

Unix Lwt_main.yield

Starting...
Tick 0/10, yield_counter 0, calls/sec 0.000000
Tick 1/10, yield_counter 540465, calls/sec 540266.761974
Tick 2/10, yield_counter 549747, calls/sec 549677.148621
Tick 3/10, yield_counter 549476, calls/sec 549397.408070
Tick 4/10, yield_counter 549914, calls/sec 549850.812379
Tick 5/10, yield_counter 549797, calls/sec 549733.694771
Tick 6/10, yield_counter 549489, calls/sec 549423.634592
Tick 7/10, yield_counter 550096, calls/sec 550033.840452
Tick 8/10, yield_counter 549419, calls/sec 549355.345411
Tick 9/10, yield_counter 549709, calls/sec 549644.132540
Tick 10/10, yield_counter 550283, calls/sec 550218.589474

Unix w/Libevt

Starting...
Tick 0/10, yield_counter 0, calls/sec 0.000000
Tick 1/10, yield_counter 477070, calls/sec 476932.184094
Tick 2/10, yield_counter 481983, calls/sec 481927.043524
Tick 3/10, yield_counter 479988, calls/sec 479936.622812
Tick 4/10, yield_counter 480808, calls/sec 480756.535041
Tick 5/10, yield_counter 480854, calls/sec 480804.020181
Tick 6/10, yield_counter 481290, calls/sec 481238.024553
Tick 7/10, yield_counter 482668, calls/sec 482621.168198
Tick 8/10, yield_counter 482312, calls/sec 482266.697352
Tick 9/10, yield_counter 481679, calls/sec 481633.756808
Tick 10/10, yield_counter 481744, calls/sec 481698.750703
Tick 0/10, pause_counter 0, calls/sec 0.000000
Tick 1/10, pause_counter 865845, calls/sec 865764.498407
Tick 2/10, pause_counter 865704, calls/sec 865615.669849
Tick 3/10, pause_counter 865974, calls/sec 865892.660710
Tick 4/10, pause_counter 865918, calls/sec 865835.840322
Tick 5/10, pause_counter 865880, calls/sec 865790.826293
Tick 6/10, pause_counter 865892, calls/sec 865809.636384
Tick 7/10, pause_counter 865502, calls/sec 865419.879793
Tick 8/10, pause_counter 865424, calls/sec 865342.712371
Tick 9/10, pause_counter 865086, calls/sec 865006.393832
Tick 10/10, pause_counter 865046, calls/sec 864965.572694
Tick 0/10, sleep_counter 0, calls/sec -nan
Tick 1/10, sleep_counter 849, calls/sec 848.563812
Tick 2/10, sleep_counter 846, calls/sec 845.762462
Tick 3/10, sleep_counter 846, calls/sec 845.000337
Tick 4/10, sleep_counter 846, calls/sec 845.588123
Tick 5/10, sleep_counter 842, calls/sec 841.743321
Tick 6/10, sleep_counter 840, calls/sec 839.464415
Tick 7/10, sleep_counter 839, calls/sec 838.098221
Tick 8/10, sleep_counter 839, calls/sec 837.764218
Tick 9/10, sleep_counter 855, calls/sec 854.471953
Tick 10/10, sleep_counter 838, calls/sec 837.522563
open Lwt
module Main (C : V1_LWT.CONSOLE) = struct
let start c =
let counter = ref 0 in
let last_counter = ref 0 in
let last_time = ref 0.0 in
let rec pauser n =
counter := !counter + 1;
Lwt.pause () >>= fun () ->
pauser (n+1)
in
let rec sleeper n =
counter := !counter + 1;
OS.Time.sleep 0.0 >>= fun () ->
sleeper (n+1)
in
(*let rec yielder n =
counter := !counter + 1;
Lwt_main.yield () >>= fun () ->
yielder (n+1)
in*)
let rec ticker s n m =
let current_time = Clock.time () in
let time_delta = current_time -. !last_time in
let counter_delta = !counter - !last_counter in
last_counter := !counter;
last_time := current_time;
C.log_s c (Printf.sprintf "Tick %d/%d, %s %d, calls/sec %f%!" n m s counter_delta ((float_of_int counter_delta) /. time_delta)) >>= fun () ->
OS.Time.sleep 1.0 >>= fun () ->
if n < m then
ticker s (n+1) m
else
Lwt.return_unit
in
C.log_s c (Printf.sprintf "Starting...%!") >>= fun () ->
(*counter := 0;
last_time := Clock.time ();
last_counter := 0;
Lwt.pick [
yielder 0 ;
ticker "yield_counter" 0 10 ] >>= fun () ->*)
counter := 0;
last_time := Clock.time ();
last_counter := 0;
Lwt.pick [
pauser 0 ;
ticker "pause_counter" 0 10 ] >>= fun () ->
counter := 0;
last_time := Clock.time ();
last_counter := 0;
Lwt.pick [
sleeper 0 ;
ticker "sleep_counter" 0 10 ] >>= fun () ->
Lwt.return_unit (* exit cleanly *)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment