Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Changed

- Replace global value of Stats by a DLS.key (#404, @lyrm)
- Lock files are now opened with O_CLOEXEC flag (#394, @vect0r-vicall)
- Update to cmdliner.1.1.0 (#382, @MisterDA)
- Mirage support: optional dependency to unix (#396, @art-w)
Expand Down
11 changes: 11 additions & 0 deletions bench.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM ocaml/opam:debian-ocaml-5.3
RUN sudo ln -sf /usr/bin/opam-2.1 /usr/bin/opam
RUN mkdir bench-dir && chown opam:opam bench-dir
WORKDIR bench-dir
RUN sudo chown opam .
COPY *.opam ./
RUN opam remote add origin https://github.com/ocaml/opam-repository.git && opam update
RUN opam pin -yn --with-version=dev .
RUN opam install -y --deps-only --with-test .
COPY . ./
ENTRYPOINT opam exec -- make bench
2 changes: 1 addition & 1 deletion index-bench.opam
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ license: "MIT"
homepage: "https://github.com/mirage/index"
bug-reports: "https://github.com/mirage/index/issues"
depends: [
"ocaml" {>= "4.03.0"}
"ocaml" {>= "5.0.0"}
"cmdliner" {>= "1.1.0"}
"dune" {>= "2.7.0"}
"fmt"
Expand Down
2 changes: 1 addition & 1 deletion index.opam
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ build: [
]

depends: [
"ocaml" {>= "4.08.0"}
"ocaml" {>= "5.0.0"}
"dune" {>= "2.7.0"}
"optint" {>= "0.1.0"}
"repr" {>= "0.6.0"}
Expand Down
78 changes: 63 additions & 15 deletions src/stats.ml
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ let fresh_stats () =
lru_misses = 0;
}

let stats = fresh_stats ()
let get () = stats
let fresh_stats_dls () = Domain.DLS.new_key (fun () -> fresh_stats ())
let kstats = fresh_stats_dls ()
let get () = Domain.DLS.get kstats

let reset_stats () =
let stats = Domain.DLS.get kstats in
stats.bytes_read <- 0;
stats.nb_reads <- 0;
stats.bytes_written <- 0;
Expand All @@ -48,23 +50,66 @@ let reset_stats () =
stats.lru_hits <- 0;
stats.lru_misses <- 0

let incr_bytes_read n = stats.bytes_read <- stats.bytes_read + n
let incr_bytes_written n = stats.bytes_written <- stats.bytes_written + n
let incr_nb_reads () = stats.nb_reads <- succ stats.nb_reads
let incr_nb_writes () = stats.nb_writes <- succ stats.nb_writes
let incr_nb_merge () = stats.nb_merge <- succ stats.nb_merge
let incr_nb_replace () = stats.nb_replace <- succ stats.nb_replace
let incr_nb_sync () = stats.nb_sync <- succ stats.nb_sync
let incr_nb_lru_hits () = stats.lru_hits <- succ stats.lru_hits
let incr_nb_lru_misses () = stats.lru_misses <- succ stats.lru_misses
let incr_nb_merge () =
let stats = Domain.DLS.get kstats in
stats.nb_merge <- succ stats.nb_merge

let incr_nb_replace () =
let stats = Domain.DLS.get kstats in
stats.nb_replace <- succ stats.nb_replace

let incr_nb_sync () =
let stats = Domain.DLS.get kstats in
stats.nb_sync <- succ stats.nb_sync

let incr_nb_lru_hits () =
let stats = Domain.DLS.get kstats in
stats.lru_hits <- succ stats.lru_hits

let incr_nb_lru_misses () =
let stats = Domain.DLS.get kstats in
stats.lru_misses <- succ stats.lru_misses

let add_read n =
incr_bytes_read n;
incr_nb_reads ()
let stats = Domain.DLS.get kstats in
stats.bytes_read <- stats.bytes_read + n;
stats.nb_reads <- succ stats.nb_reads

let add_write n =
incr_bytes_written n;
incr_nb_writes ()
let stats = Domain.DLS.get kstats in
stats.bytes_written <- stats.bytes_written + n;
stats.nb_writes <- succ stats.nb_writes

let merge s1 s2 =
{
bytes_read = s1.bytes_read + s2.bytes_read;
nb_reads = s1.nb_reads + s2.nb_reads;
bytes_written = s1.bytes_written + s2.bytes_written;
nb_writes = s1.nb_writes + s2.nb_writes;
nb_merge = s1.nb_merge + s2.nb_merge;
merge_durations = s1.merge_durations @ s2.merge_durations;
nb_replace = s1.nb_replace + s2.nb_replace;
replace_durations = s1.replace_durations @ s2.replace_durations;
nb_sync = s1.nb_sync + s2.nb_sync;
time_sync = s1.time_sync +. s2.time_sync;
lru_hits = s1.lru_hits + s2.lru_hits;
lru_misses = s1.lru_misses + s2.lru_misses;
}

let merge_in s2 =
let s1 = Domain.DLS.get kstats in
s1.bytes_read <- s1.bytes_read + s2.bytes_read;
s1.nb_reads <- s1.nb_reads + s2.nb_reads;
s1.bytes_written <- s1.bytes_written + s2.bytes_written;
s1.nb_writes <- s1.nb_writes + s2.nb_writes;
s1.nb_merge <- s1.nb_merge + s2.nb_merge;
s1.merge_durations <- s1.merge_durations @ s2.merge_durations;
s1.nb_replace <- s1.nb_replace + s2.nb_replace;
s1.replace_durations <- s1.replace_durations @ s2.replace_durations;
s1.nb_sync <- s1.nb_sync + s2.nb_sync;
s1.time_sync <- s1.time_sync +. s2.time_sync;
s1.lru_hits <- s1.lru_hits + s2.lru_hits;
s1.lru_misses <- s1.lru_misses + s2.lru_misses

module Make (Clock : Platform.CLOCK) = struct
let replace_timer = ref (Clock.counter ())
Expand All @@ -78,6 +123,7 @@ module Make (Clock : Platform.CLOCK) = struct
if !nb_replace = sampling_interval then (
let span = Clock.count !replace_timer in
let average = Mtime.span_to_us span /. float_of_int !nb_replace in
let stats = Domain.DLS.get kstats in
stats.replace_durations <- average :: stats.replace_durations;
replace_timer := Clock.counter ();
nb_replace := 0)
Expand All @@ -86,11 +132,13 @@ module Make (Clock : Platform.CLOCK) = struct
let timer = Clock.counter () in
f ();
let span = Clock.count timer in
let stats = Domain.DLS.get kstats in
stats.time_sync <- Mtime.span_to_us span

let drop_head l = if List.length l >= 10 then List.tl l else l

let add_merge_duration span =
let span = Mtime.span_to_us span in
let stats = Domain.DLS.get kstats in
stats.merge_durations <- drop_head stats.merge_durations @ [ span ]
end
2 changes: 2 additions & 0 deletions src/stats.mli
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ val incr_nb_replace : unit -> unit
val incr_nb_sync : unit -> unit
val incr_nb_lru_hits : unit -> unit
val incr_nb_lru_misses : unit -> unit
val merge : t -> t -> t
val merge_in : t -> unit

module Make (_ : Platform.CLOCK) : sig
val start_replace : unit -> unit
Expand Down