cgroup-internals.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. #include "sys_fs_cgroup.h"
  2. #ifndef NETDATA_CGROUP_INTERNALS_H
  3. #define NETDATA_CGROUP_INTERNALS_H 1
  4. #ifdef NETDATA_INTERNAL_CHECKS
  5. #define CGROUP_PROCFILE_FLAG PROCFILE_FLAG_DEFAULT
  6. #else
  7. #define CGROUP_PROCFILE_FLAG PROCFILE_FLAG_NO_ERROR_ON_FILE_IO
  8. #endif
  9. struct blkio {
  10. int updated;
  11. int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  12. int delay_counter;
  13. char *filename;
  14. unsigned long long Read;
  15. unsigned long long Write;
  16. /*
  17. unsigned long long Sync;
  18. unsigned long long Async;
  19. unsigned long long Total;
  20. */
  21. };
  22. struct pids {
  23. char *pids_current_filename;
  24. int pids_current_updated;
  25. unsigned long long pids_current;
  26. };
  27. // https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
  28. struct memory {
  29. ARL_BASE *arl_base;
  30. ARL_ENTRY *arl_dirty;
  31. ARL_ENTRY *arl_swap;
  32. int updated_detailed;
  33. int updated_usage_in_bytes;
  34. int updated_msw_usage_in_bytes;
  35. int updated_failcnt;
  36. int enabled_detailed; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  37. int enabled_usage_in_bytes; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  38. int enabled_msw_usage_in_bytes; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  39. int enabled_failcnt; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  40. int delay_counter_detailed;
  41. int delay_counter_failcnt;
  42. char *filename_detailed;
  43. char *filename_usage_in_bytes;
  44. char *filename_msw_usage_in_bytes;
  45. char *filename_failcnt;
  46. int detailed_has_dirty;
  47. int detailed_has_swap;
  48. // detailed metrics
  49. /*
  50. unsigned long long cache;
  51. unsigned long long rss;
  52. unsigned long long rss_huge;
  53. unsigned long long mapped_file;
  54. unsigned long long writeback;
  55. unsigned long long dirty;
  56. unsigned long long swap;
  57. unsigned long long pgpgin;
  58. unsigned long long pgpgout;
  59. unsigned long long pgfault;
  60. unsigned long long pgmajfault;
  61. unsigned long long inactive_anon;
  62. unsigned long long active_anon;
  63. unsigned long long inactive_file;
  64. unsigned long long active_file;
  65. unsigned long long unevictable;
  66. unsigned long long hierarchical_memory_limit;
  67. */
  68. //unified cgroups metrics
  69. unsigned long long anon;
  70. unsigned long long kernel_stack;
  71. unsigned long long slab;
  72. unsigned long long sock;
  73. // unsigned long long shmem;
  74. unsigned long long anon_thp;
  75. //unsigned long long file_writeback;
  76. //unsigned long long file_dirty;
  77. //unsigned long long file;
  78. unsigned long long total_cache;
  79. unsigned long long total_rss;
  80. unsigned long long total_rss_huge;
  81. unsigned long long total_mapped_file;
  82. unsigned long long total_writeback;
  83. unsigned long long total_dirty;
  84. unsigned long long total_swap;
  85. unsigned long long total_pgpgin;
  86. unsigned long long total_pgpgout;
  87. unsigned long long total_pgfault;
  88. unsigned long long total_pgmajfault;
  89. /*
  90. unsigned long long total_inactive_anon;
  91. unsigned long long total_active_anon;
  92. */
  93. unsigned long long total_inactive_file;
  94. /*
  95. unsigned long long total_active_file;
  96. unsigned long long total_unevictable;
  97. */
  98. // single file metrics
  99. unsigned long long usage_in_bytes;
  100. unsigned long long msw_usage_in_bytes;
  101. unsigned long long failcnt;
  102. };
  103. // https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
  104. struct cpuacct_stat {
  105. int updated;
  106. int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  107. char *filename;
  108. unsigned long long user; // v1, v2(user_usec)
  109. unsigned long long system; // v1, v2(system_usec)
  110. };
  111. // https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
  112. struct cpuacct_usage {
  113. int updated;
  114. int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  115. char *filename;
  116. unsigned int cpus;
  117. unsigned long long *cpu_percpu;
  118. };
  119. // represents cpuacct/cpu.stat, for v2 'cpuacct_stat' is used for 'user_usec', 'system_usec'
  120. struct cpuacct_cpu_throttling {
  121. int updated;
  122. int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  123. char *filename;
  124. unsigned long long nr_periods;
  125. unsigned long long nr_throttled;
  126. unsigned long long throttled_time;
  127. unsigned long long nr_throttled_perc;
  128. };
  129. // https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/sec-cpu#sect-cfs
  130. // https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/using-cgroups-v2-to-control-distribution-of-cpu-time-for-applications_managing-monitoring-and-updating-the-kernel#proc_controlling-distribution-of-cpu-time-for-applications-by-adjusting-cpu-weight_using-cgroups-v2-to-control-distribution-of-cpu-time-for-applications
  131. struct cpuacct_cpu_shares {
  132. int updated;
  133. int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
  134. char *filename;
  135. unsigned long long shares;
  136. };
  137. struct cgroup_network_interface {
  138. const char *host_device;
  139. const char *container_device;
  140. struct cgroup_network_interface *next;
  141. };
  142. enum cgroups_container_orchestrator {
  143. CGROUPS_ORCHESTRATOR_UNSET,
  144. CGROUPS_ORCHESTRATOR_UNKNOWN,
  145. CGROUPS_ORCHESTRATOR_K8S
  146. };
  147. // *** WARNING *** The fields are not thread safe. Take care of safe usage.
  148. struct cgroup {
  149. uint32_t options;
  150. int first_time_seen; // first time seen by the discoverer
  151. int processed; // the discoverer is done processing a cgroup (resolved name, set 'enabled' option)
  152. char available; // found in the filesystem
  153. char enabled; // enabled in the config
  154. bool function_ready; // true after the first iteration of chart creation/update
  155. char pending_renames;
  156. char *id;
  157. uint32_t hash;
  158. char *intermediate_id; // TODO: remove it when the renaming script is fixed
  159. char *chart_id;
  160. uint32_t hash_chart_id;
  161. // 'cgroup_name' label value.
  162. // by default this is the *id (path), later changed to the resolved name (cgroup-name.sh) or systemd service name.
  163. char *name;
  164. RRDLABELS *chart_labels;
  165. int container_orchestrator;
  166. struct cpuacct_stat cpuacct_stat;
  167. struct cpuacct_usage cpuacct_usage;
  168. struct cpuacct_cpu_throttling cpuacct_cpu_throttling;
  169. struct cpuacct_cpu_shares cpuacct_cpu_shares;
  170. struct memory memory;
  171. struct blkio io_service_bytes; // bytes
  172. struct blkio io_serviced; // operations
  173. struct blkio throttle_io_service_bytes; // bytes
  174. struct blkio throttle_io_serviced; // operations
  175. struct blkio io_merged; // operations
  176. struct blkio io_queued; // operations
  177. struct pids pids;
  178. struct cgroup_network_interface *interfaces;
  179. struct pressure cpu_pressure;
  180. struct pressure io_pressure;
  181. struct pressure memory_pressure;
  182. struct pressure irq_pressure;
  183. // Cpu
  184. RRDSET *st_cpu;
  185. RRDDIM *st_cpu_rd_user;
  186. RRDDIM *st_cpu_rd_system;
  187. RRDSET *st_cpu_limit;
  188. RRDSET *st_cpu_per_core;
  189. RRDSET *st_cpu_nr_throttled;
  190. RRDSET *st_cpu_throttled_time;
  191. RRDSET *st_cpu_shares;
  192. // Memory
  193. RRDSET *st_mem;
  194. RRDDIM *st_mem_rd_ram;
  195. RRDDIM *st_mem_rd_swap;
  196. RRDSET *st_mem_utilization;
  197. RRDSET *st_writeback;
  198. RRDSET *st_mem_activity;
  199. RRDSET *st_pgfaults;
  200. RRDSET *st_mem_usage;
  201. RRDSET *st_mem_usage_limit;
  202. RRDSET *st_mem_failcnt;
  203. // Blkio
  204. RRDSET *st_io;
  205. RRDDIM *st_io_rd_read;
  206. RRDDIM *st_io_rd_written;
  207. RRDSET *st_serviced_ops;
  208. RRDSET *st_throttle_io;
  209. RRDDIM *st_throttle_io_rd_read;
  210. RRDDIM *st_throttle_io_rd_written;
  211. RRDSET *st_throttle_serviced_ops;
  212. RRDSET *st_queued_ops;
  213. RRDSET *st_merged_ops;
  214. // Pids
  215. RRDSET *st_pids;
  216. RRDDIM *st_pids_rd_pids_current;
  217. // per cgroup chart variables
  218. char *filename_cpuset_cpus;
  219. unsigned long long cpuset_cpus;
  220. char *filename_cpu_cfs_period;
  221. unsigned long long cpu_cfs_period;
  222. char *filename_cpu_cfs_quota;
  223. unsigned long long cpu_cfs_quota;
  224. const RRDSETVAR_ACQUIRED *chart_var_cpu_limit;
  225. NETDATA_DOUBLE prev_cpu_usage;
  226. char *filename_memory_limit;
  227. unsigned long long memory_limit;
  228. const RRDSETVAR_ACQUIRED *chart_var_memory_limit;
  229. char *filename_memoryswap_limit;
  230. unsigned long long memoryswap_limit;
  231. const RRDSETVAR_ACQUIRED *chart_var_memoryswap_limit;
  232. const DICTIONARY_ITEM *cgroup_netdev_link;
  233. struct cgroup *next;
  234. struct cgroup *discovered_next;
  235. };
  236. struct discovery_thread {
  237. uv_thread_t thread;
  238. uv_mutex_t mutex;
  239. uv_cond_t cond_var;
  240. int exited;
  241. };
  242. extern struct discovery_thread discovery_thread;
  243. extern char *cgroups_rename_script;
  244. extern char cgroup_chart_id_prefix[];
  245. extern char services_chart_id_prefix[];
  246. extern uv_mutex_t cgroup_root_mutex;
  247. void cgroup_discovery_worker(void *ptr);
  248. extern int is_inside_k8s;
  249. extern long system_page_size;
  250. extern int cgroup_enable_cpuacct_stat;
  251. extern int cgroup_enable_cpuacct_usage;
  252. extern int cgroup_enable_cpuacct_cpu_throttling;
  253. extern int cgroup_enable_cpuacct_cpu_shares;
  254. extern int cgroup_enable_memory;
  255. extern int cgroup_enable_detailed_memory;
  256. extern int cgroup_enable_memory_failcnt;
  257. extern int cgroup_enable_swap;
  258. extern int cgroup_enable_blkio_io;
  259. extern int cgroup_enable_blkio_ops;
  260. extern int cgroup_enable_blkio_throttle_io;
  261. extern int cgroup_enable_blkio_throttle_ops;
  262. extern int cgroup_enable_blkio_merged_ops;
  263. extern int cgroup_enable_blkio_queued_ops;
  264. extern int cgroup_enable_pressure_cpu;
  265. extern int cgroup_enable_pressure_io_some;
  266. extern int cgroup_enable_pressure_io_full;
  267. extern int cgroup_enable_pressure_memory_some;
  268. extern int cgroup_enable_pressure_memory_full;
  269. extern int cgroup_enable_pressure_irq_some;
  270. extern int cgroup_enable_pressure_irq_full;
  271. extern int cgroup_enable_systemd_services;
  272. extern int cgroup_enable_systemd_services_detailed_memory;
  273. extern int cgroup_used_memory;
  274. extern int cgroup_use_unified_cgroups;
  275. extern int cgroup_unified_exist;
  276. extern int cgroup_search_in_devices;
  277. extern int cgroup_check_for_new_every;
  278. extern int cgroup_update_every;
  279. extern int cgroup_containers_chart_priority;
  280. extern int cgroup_recheck_zero_blkio_every_iterations;
  281. extern int cgroup_recheck_zero_mem_failcnt_every_iterations;
  282. extern int cgroup_recheck_zero_mem_detailed_every_iterations;
  283. extern char *cgroup_cpuacct_base;
  284. extern char *cgroup_cpuset_base;
  285. extern char *cgroup_blkio_base;
  286. extern char *cgroup_memory_base;
  287. extern char *cgroup_pids_base;
  288. extern char *cgroup_devices_base;
  289. extern char *cgroup_unified_base;
  290. extern int cgroup_root_count;
  291. extern int cgroup_root_max;
  292. extern int cgroup_max_depth;
  293. extern SIMPLE_PATTERN *enabled_cgroup_paths;
  294. extern SIMPLE_PATTERN *enabled_cgroup_names;
  295. extern SIMPLE_PATTERN *search_cgroup_paths;
  296. extern SIMPLE_PATTERN *enabled_cgroup_renames;
  297. extern SIMPLE_PATTERN *systemd_services_cgroups;
  298. extern SIMPLE_PATTERN *entrypoint_parent_process_comm;
  299. extern char *cgroups_network_interface_script;
  300. extern int cgroups_check;
  301. extern uint32_t Read_hash;
  302. extern uint32_t Write_hash;
  303. extern uint32_t user_hash;
  304. extern uint32_t system_hash;
  305. extern uint32_t user_usec_hash;
  306. extern uint32_t system_usec_hash;
  307. extern uint32_t nr_periods_hash;
  308. extern uint32_t nr_throttled_hash;
  309. extern uint32_t throttled_time_hash;
  310. extern uint32_t throttled_usec_hash;
  311. extern struct cgroup *cgroup_root;
  312. extern netdata_ebpf_cgroup_shm_t shm_cgroup_ebpf;
  313. extern int shm_fd_cgroup_ebpf;
  314. extern sem_t *shm_mutex_cgroup_ebpf;
  315. enum cgroups_type { CGROUPS_AUTODETECT_FAIL, CGROUPS_V1, CGROUPS_V2 };
  316. enum cgroups_systemd_setting {
  317. SYSTEMD_CGROUP_ERR,
  318. SYSTEMD_CGROUP_LEGACY,
  319. SYSTEMD_CGROUP_HYBRID,
  320. SYSTEMD_CGROUP_UNIFIED
  321. };
  322. struct cgroups_systemd_config_setting {
  323. char *name;
  324. enum cgroups_systemd_setting setting;
  325. };
  326. extern struct cgroups_systemd_config_setting cgroups_systemd_options[];
  327. static inline int matches_enabled_cgroup_paths(char *id) {
  328. return simple_pattern_matches(enabled_cgroup_paths, id);
  329. }
  330. static inline int matches_enabled_cgroup_names(char *name) {
  331. return simple_pattern_matches(enabled_cgroup_names, name);
  332. }
  333. static inline int matches_enabled_cgroup_renames(char *id) {
  334. return simple_pattern_matches(enabled_cgroup_renames, id);
  335. }
  336. static inline int matches_systemd_services_cgroups(char *id) {
  337. return simple_pattern_matches(systemd_services_cgroups, id);
  338. }
  339. static inline int matches_search_cgroup_paths(const char *dir) {
  340. return simple_pattern_matches(search_cgroup_paths, dir);
  341. }
  342. static inline int matches_entrypoint_parent_process_comm(const char *comm) {
  343. return simple_pattern_matches(entrypoint_parent_process_comm, comm);
  344. }
  345. static inline int is_cgroup_systemd_service(struct cgroup *cg) {
  346. return (int)(cg->options & CGROUP_OPTIONS_SYSTEM_SLICE_SERVICE);
  347. }
  348. static inline int k8s_is_kubepod(struct cgroup *cg) {
  349. return cg->container_orchestrator == CGROUPS_ORCHESTRATOR_K8S;
  350. }
  351. static inline char *cgroup_chart_type(char *buffer, struct cgroup *cg) {
  352. buffer[0] = '\0';
  353. if (cg->chart_id[0] == '\0' || (cg->chart_id[0] == '/' && cg->chart_id[1] == '\0'))
  354. strncpy(buffer, "cgroup_root", RRD_ID_LENGTH_MAX);
  355. else if (is_cgroup_systemd_service(cg))
  356. snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s%s", services_chart_id_prefix, cg->chart_id);
  357. else
  358. snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s%s", cgroup_chart_id_prefix, cg->chart_id);
  359. return buffer;
  360. }
  361. #define RRDFUNCTIONS_CGTOP_HELP "View running containers"
  362. int cgroup_function_cgroup_top(BUFFER *wb, int timeout, const char *function, void *collector_data,
  363. rrd_function_result_callback_t result_cb, void *result_cb_data,
  364. rrd_function_is_cancelled_cb_t is_cancelled_cb, void *is_cancelled_cb_data,
  365. rrd_function_register_canceller_cb_t register_canceller_cb, void *register_canceller_cb_data);
  366. int cgroup_function_systemd_top(BUFFER *wb, int timeout, const char *function, void *collector_data,
  367. rrd_function_result_callback_t result_cb, void *result_cb_data,
  368. rrd_function_is_cancelled_cb_t is_cancelled_cb, void *is_cancelled_cb_data,
  369. rrd_function_register_canceller_cb_t register_canceller_cb, void *register_canceller_cb_data);
  370. void cgroup_netdev_link_init(void);
  371. const DICTIONARY_ITEM *cgroup_netdev_get(struct cgroup *cg);
  372. void cgroup_netdev_delete(struct cgroup *cg);
  373. void update_cpu_utilization_chart(struct cgroup *cg);
  374. void update_cpu_utilization_limit_chart(struct cgroup *cg, NETDATA_DOUBLE cpu_limit);
  375. void update_cpu_throttled_chart(struct cgroup *cg);
  376. void update_cpu_throttled_duration_chart(struct cgroup *cg);
  377. void update_cpu_shares_chart(struct cgroup *cg);
  378. void update_cpu_per_core_usage_chart(struct cgroup *cg);
  379. void update_mem_usage_limit_chart(struct cgroup *cg, unsigned long long memory_limit);
  380. void update_mem_utilization_chart(struct cgroup *cg, unsigned long long memory_limit);
  381. void update_mem_usage_detailed_chart(struct cgroup *cg);
  382. void update_mem_writeback_chart(struct cgroup *cg);
  383. void update_mem_activity_chart(struct cgroup *cg);
  384. void update_mem_pgfaults_chart(struct cgroup *cg);
  385. void update_mem_failcnt_chart(struct cgroup *cg);
  386. void update_mem_usage_chart(struct cgroup *cg);
  387. void update_io_serviced_bytes_chart(struct cgroup *cg);
  388. void update_io_serviced_ops_chart(struct cgroup *cg);
  389. void update_throttle_io_serviced_bytes_chart(struct cgroup *cg);
  390. void update_throttle_io_serviced_ops_chart(struct cgroup *cg);
  391. void update_io_queued_ops_chart(struct cgroup *cg);
  392. void update_io_merged_ops_chart(struct cgroup *cg);
  393. void update_pids_current_chart(struct cgroup *cg);
  394. void update_cpu_some_pressure_chart(struct cgroup *cg);
  395. void update_cpu_some_pressure_stall_time_chart(struct cgroup *cg);
  396. void update_cpu_full_pressure_chart(struct cgroup *cg);
  397. void update_cpu_full_pressure_stall_time_chart(struct cgroup *cg);
  398. void update_mem_some_pressure_chart(struct cgroup *cg);
  399. void update_mem_some_pressure_stall_time_chart(struct cgroup *cg);
  400. void update_mem_full_pressure_chart(struct cgroup *cg);
  401. void update_mem_full_pressure_stall_time_chart(struct cgroup *cg);
  402. void update_irq_some_pressure_chart(struct cgroup *cg);
  403. void update_irq_some_pressure_stall_time_chart(struct cgroup *cg);
  404. void update_irq_full_pressure_chart(struct cgroup *cg);
  405. void update_irq_full_pressure_stall_time_chart(struct cgroup *cg);
  406. void update_io_some_pressure_chart(struct cgroup *cg);
  407. void update_io_some_pressure_stall_time_chart(struct cgroup *cg);
  408. void update_io_full_pressure_chart(struct cgroup *cg);
  409. void update_io_full_pressure_stall_time_chart(struct cgroup *cg);
  410. #endif // NETDATA_CGROUP_INTERNALS_H