diff options
author | Arturo Borrero Gonzalez <arturo@netfilter.org> | 2017-09-07 13:36:53 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2017-09-20 10:53:43 +0200 |
commit | 10a85d467da4e045fbc754489dfcdd8c097ed44e (patch) | |
tree | 319410f466618542c6ab17d2c003f582ee4966f5 /src | |
parent | fafa58537a014af5205896b8753a79b6bf1b8f44 (diff) |
ulogd: use a RT scheduler by default
Is common that ulogd runs in scenarios where a lot of packets are to be logged.
If there are more packets than ulogd can handle, users can start seing log
messages like this:
ulogd[556]: We are losing events. Please, consider using the clauses \
`netlink_socket_buffer_size' and `netlink_socket_buffer_maxsize'
Which means that Netlink buffer overrun have happened.
There are several approaches to prevent this situation:
* in the ruleset, limit the amount of packet queued for log
* in the ruleset, instruct the kernel to use a queue-threshold
* from userspace, increment Netlink buffer sizes
* from userspace, configure ulogd to run as high priority process
The first 3 method can be configured by users at runtime.
This patch deals with the last method. SCHED_RR is configured by default,
with no associated configuration parameter for users, since I believe
this is common enough, and should produce no harm.
A similar approach is used in the conntrackd daemon.
Signed-off-by: Arturo Borrero Gonzalez <arturo@netfilter.org>
Acked-by: Eric Leblond <eric@regit.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/ulogd.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/ulogd.c b/src/ulogd.c index b85d0ee..684444f 100644 --- a/src/ulogd.c +++ b/src/ulogd.c @@ -64,6 +64,7 @@ #include <syslog.h> #include <sys/time.h> #include <sys/stat.h> +#include <sched.h> #include <ulogd/conffile.h> #include <ulogd/ulogd.h> #ifdef DEBUG @@ -1395,6 +1396,19 @@ static void signal_handler_task(int signal) deliver_signal_pluginstances(signal); } +static void set_scheduler(void) +{ + struct sched_param schedparam; + int sched_type; + + schedparam.sched_priority = sched_get_priority_max(SCHED_RR); + sched_type = SCHED_RR; + + if (sched_setscheduler(0, sched_type, &schedparam) < 0) + fprintf(stderr, "WARNING: scheduler configuration failed:" + " %s\n", strerror(errno)); +} + static void print_usage(void) { printf("ulogd Version %s\n", VERSION); @@ -1589,6 +1603,7 @@ int main(int argc, char* argv[]) signal(SIGALRM, &signal_handler); signal(SIGUSR1, &signal_handler); signal(SIGUSR2, &signal_handler); + set_scheduler(); ulogd_log(ULOGD_INFO, "initialization finished, entering main loop\n"); |