Line data Source code
1 : #include "configure.h"
2 :
3 0 : #define NAME "sysctl"
4 :
5 : #include <stdio.h>
6 : #include <linux/capability.h>
7 :
8 : static void
9 : init_perm( fd_caps_ctx_t * caps,
10 0 : config_t const * config FD_PARAM_UNUSED ) {
11 0 : fd_caps_check_capability( caps, NAME, CAP_SYS_ADMIN, "set kernel parameters in `/proc/sys`" );
12 0 : }
13 :
14 0 : #define ENFORCE_MINIMUM 0
15 0 : #define WARN_MINIMUM 1
16 0 : #define WARN_EXACT 2
17 :
18 : typedef struct {
19 : char const * path;
20 : uint value;
21 : int mode;
22 : } sysctl_param_t;
23 :
24 : static const sysctl_param_t params[] = {
25 : {
26 : "/proc/sys/vm/max_map_count",
27 : 1000000,
28 : ENFORCE_MINIMUM,
29 : },
30 : {
31 : "/proc/sys/fs/file-max",
32 : CONFIGURE_NR_OPEN_FILES,
33 : ENFORCE_MINIMUM,
34 : },
35 : {
36 : "/proc/sys/fs/nr_open",
37 : CONFIGURE_NR_OPEN_FILES,
38 : ENFORCE_MINIMUM,
39 : },
40 : {
41 : "/proc/sys/net/ipv4/conf/lo/rp_filter",
42 : 2,
43 : ENFORCE_MINIMUM,
44 : },
45 : {
46 : "/proc/sys/net/ipv4/conf/lo/accept_local",
47 : 1,
48 : ENFORCE_MINIMUM,
49 : },
50 : {
51 : "/proc/sys/net/core/bpf_jit_enable",
52 : 1,
53 : WARN_MINIMUM,
54 : },
55 : {
56 : "/proc/sys/kernel/numa_balancing",
57 : 0,
58 : WARN_EXACT,
59 : }
60 : };
61 :
62 : static const char * ERR_MSG = "system might not support configuring sysctl,";
63 :
64 :
65 : /* Some of these sysctl limits are needed for the Agave client, not
66 : Firedancer. We set them on their behalf to make configuration easier
67 : for users. */
68 :
69 : static void
70 0 : init( config_t * const config ) {
71 0 : (void)config;
72 0 : for( ulong i=0; i<sizeof( params ) / sizeof( params[ 0 ] ); i++ ) {
73 0 : uint param = read_uint_file( params[ i ].path, ERR_MSG );
74 0 : switch( params[ i ].mode ) {
75 0 : case ENFORCE_MINIMUM:
76 0 : if( FD_UNLIKELY( param<params[ i ].value ) ) {
77 0 : FD_LOG_NOTICE(( "RUN: `echo \"%u\" > %s`", params[ i ].value, params[ i ].path ) );
78 0 : write_uint_file( params[ i ].path, params[ i ].value );
79 0 : }
80 0 : break;
81 0 : default:
82 0 : break;
83 0 : }
84 0 : }
85 0 : }
86 :
87 : static configure_result_t
88 0 : check( config_t const * config FD_PARAM_UNUSED ) {
89 0 : static int has_warned = 0;
90 :
91 0 : for( ulong i=0; i<sizeof( params ) / sizeof( params[ 0 ] ); i++ ) {
92 0 : uint param = read_uint_file( params[ i ].path, ERR_MSG );
93 0 : switch( params[ i ].mode ) {
94 0 : case ENFORCE_MINIMUM:
95 0 : if( FD_UNLIKELY( param<params[ i ].value ) )
96 0 : NOT_CONFIGURED( "kernel parameter `%s` is too low (got %u but expected at least %u)", params[ i ].path, param, params[ i ].value );
97 0 : break;
98 0 : case WARN_MINIMUM:
99 0 : if( FD_UNLIKELY( !has_warned && param<params[ i ].value ) )
100 0 : FD_LOG_WARNING(( "kernel parameter `%s` is too low (got %u but expected at least %u). Proceeding but performance may be reduced.", params[ i ].path, param, params[ i ].value ));
101 0 : break;
102 0 : case WARN_EXACT:
103 0 : if( FD_UNLIKELY( !has_warned && param!=params[ i ].value ) )
104 0 : FD_LOG_WARNING(( "kernel parameter `%s` is set to %u, not the expected value of %u. Proceeding but performance may be reduced.", params[ i ].path, param, params[ i ].value ));
105 0 : break;
106 0 : }
107 0 : }
108 :
109 0 : has_warned = 1;
110 :
111 0 : CONFIGURE_OK();
112 0 : }
113 :
114 : configure_stage_t fd_cfg_stage_sysctl = {
115 : .name = NAME,
116 : .always_recreate = 0,
117 : .enabled = NULL,
118 : .init_perm = init_perm,
119 : .fini_perm = NULL,
120 : .init = init,
121 : .fini = NULL,
122 : .check = check,
123 : };
124 :
125 : #undef NAME
|