Guest User

Untitled

a guest
Jun 20th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. external alloc_dependent_memory : (int [@untaged]) -> unit = "abort" "caml_alloc_dependent_memory"
  2. external free_dependent_memory : (int [@untaged]) -> unit = "abort" "caml_free_dependent_memory"
  3.  
  4. let printf = Printf.printf
  5.  
  6. let by_words = ref 0
  7. let word_size = Sys.word_size / 8 (* word size in bytes *)
  8.  
  9. type 'a data = Bytes of bytes
  10. | BigArr of 'a
  11.  
  12. let dealloc words () =
  13. by_words := !by_words - words
  14.  
  15.  
  16. let alloc_bytes size =
  17. let by = Bytes.create size in
  18. let words = size / word_size in
  19. by_words := !by_words + words;
  20. Gc.finalise_last (dealloc words) by;
  21. Bytes by
  22.  
  23. let minor_heap_size = Gc.((get ()).minor_heap_size)
  24. let ba_words = ref 0
  25. let ba_allocated = ref 0
  26. let alloc_ba size =
  27. let ba = Bigarray.(Array1.create char c_layout size) in
  28. let words = size / word_size in
  29. ba_words := !ba_words + words;
  30. alloc_dependent_memory size;
  31. Gc.finalise_last (fun () ->
  32. free_dependent_memory size;
  33. ba_words := !ba_words - words) ba;
  34.  
  35. ba_allocated := !ba_words + words;
  36. if !ba_allocated > minor_heap_size then begin
  37. ba_allocated := 0;
  38. ignore(Gc.major_slice (-1));
  39. end;
  40. BigArr ba
  41.  
  42. let kmgt size =
  43. let size = size * word_size in
  44. let sprintf = Printf.sprintf in
  45. if size < 512 * 1024 then
  46. sprintf "%.2fk" (float size /. 0x1.0p10)
  47. else if size < 512 * 1024 * 1024 then
  48. sprintf "%.2fk" (float size /. 0x1.0p20)
  49. else if size < 512 * 1024 * 1024 * 1024 then
  50. sprintf "%.2fg" (float size /. 0x1.0p30)
  51. else
  52. sprintf "%.2ft" (float size /. 0x1.0p40)
  53.  
  54. let statm () =
  55. let open Scanf in
  56. let fd = Scanning.from_file "/proc/self/statm" in
  57. let result = bscanf fd "%i %i %i"
  58. (fun size resident shared -> (size, resident, shared) ) in
  59. Scanning.close_in fd;
  60. result
  61.  
  62. let gc_stat =
  63. let f () =
  64. while true do
  65. let stat = Gc.stat () in
  66. let vss, _, _ = statm () in
  67. printf "% 9s vss; % 9s heap; % 9s live; % 9s ba; % 9s by\n%!"
  68. (kmgt (vss * 4096 / word_size)) (kmgt stat.heap_words)
  69. (kmgt stat.live_words) (kmgt !ba_words) (kmgt !by_words);
  70. flush stdout;
  71. Unix.sleepf 0.5;
  72. done
  73. in
  74. Thread.create f ()
  75.  
  76. let rec trigger _ =
  77. printf "***\n%!";
  78. Gc.major ();
  79. Unix.alarm 2 |> ignore;
  80. Sys.(set_signal sigalrm (Signal_handle trigger))
  81.  
  82.  
  83. let _ =
  84. Sys.(set_signal sigalrm (Signal_handle trigger));
  85. Unix.alarm 2 |> ignore;
  86. let q = Queue.create () in
  87. while true do
  88. let data1 = alloc_ba (4096 * 1024) in
  89. Queue.push data1 q;
  90. let data2 = alloc_bytes (4096 * 1024) in
  91. Queue.push data2 q;
  92. let _data1 = alloc_ba (4096 * 1024) in
  93. let _data2 = alloc_bytes (4096 * 1024) in
  94. while (Queue.length q > 1000) do
  95. ignore(Queue.pop q);
  96. done;
  97. Thread.yield ();
  98. done
Add Comment
Please, Sign In to add comment