TCPSPSuite
memoryinfo.hpp
1 /*
2  * memoryinfo.h
3  *
4  * Created on: Jul 16, 2018
5  * Author: lukas
6  */
7 
8 #ifndef SRC_MANAGER_MEMORYINFO_HPP_
9 #define SRC_MANAGER_MEMORYINFO_HPP_
10 
11 #include <iostream>
12 #include <thread>
13 #include <mutex>
14 #include <condition_variable>
15 #include <vector>
16 #include <string>
17 #include <unordered_map>
18 
19 #include "generated_config.hpp"
20 #include "../util/log.hpp"
21 
22 namespace manager {
23 
24 #ifdef PAPI_FOUND
25 class PAPIPerformanceInfo {
26 public:
27  PAPIPerformanceInfo(const std::vector<std::string> & measurements) noexcept;
28 
29  void start() noexcept;
30  void stop() noexcept;
31 
32  std::vector<std::pair<std::string, long long>> get_counts() const noexcept;
33 
34 private:
35  bool initialized;
36 
37  void initialize() noexcept;
38 
39  const std::vector<std::string> & measurements;
40 
41  size_t num_counters;
42 
43  std::vector<int> selected_events;
44  std::vector<std::string> selected_event_names;
45  std::vector<long long> event_counts;
46  Log l;
47 };
48 #else
49 // Dummy s.t. we can pass null pointers around
50 class PAPIPerformanceInfo {};
51 #endif
52 
53 class LinuxMemoryInfo
54 {
55 public:
56  LinuxMemoryInfo(unsigned int sampling_ms);
57 
58  void start() noexcept;
59  void stop() noexcept;
60  void measure() noexcept;
61 
62  size_t get_rss_bytes_max() const noexcept;
63  size_t get_data_bytes_max() const noexcept;
64 
65 #ifdef INSTRUMENT_MALLOC
66  size_t get_malloc_count() const noexcept;
67  size_t get_malloc_max_size() const noexcept;
68 #endif
69 
70  size_t get_minor_pagefaults() const noexcept;
71  size_t get_major_pagefaults() const noexcept;
72  unsigned long get_user_usecs() const noexcept;
73  unsigned long get_system_usecs() const noexcept;
74 
75 private:
76  void reset() noexcept;
77 
78  void run() noexcept;
79  void sample() noexcept;
80 
81  bool stop_requested = false;
82 
83  unsigned int sampling_ms;
84 
85  size_t rss_pages_before;
86  size_t rss_max_pages;
87  size_t data_pages_before;
88  size_t data_max_pages;
89  size_t major_pagefaults_before;
90  size_t major_pagefaults_after;
91  size_t minor_pagefaults_before;
92  size_t minor_pagefaults_after;
93  unsigned long user_usecs_before;
94  unsigned long user_usecs_after;
95  unsigned long system_usecs_before;
96  unsigned long system_usecs_after;
97 
98 #ifdef INSTRUMENT_MALLOC
99  size_t malloc_allocs_before;
100  size_t malloc_allocs_after;
101  size_t malloc_peak;
102 #endif
103 
104  size_t page_size;
105 
106  void get_mem_proc_data(size_t * rss_out, size_t * data_out) noexcept;
107  void get_mem_syscall_data(size_t * major_pagefault_out, size_t * minor_pagefault_out,
108  unsigned long * user_usecs_out, unsigned long * system_usecs_out) noexcept;
109 
110  std::thread my_thread;
111  std::mutex m;
112  std::condition_variable notifier;
113  constexpr static int ACTION_FINISH = 0;
114  constexpr static int ACTION_MEASURE = 1;
115  int requested_action;
116 };
117 
118 }
119 
120 #endif /* SRC_MANAGER_MEMORYINFO_HPP_ */