remember that there are many files involved

/etc/default/rsyslog
/etc/init/rsyslog.conf
/etc/init.d/rsyslog

you have to put the right thing in the right file

ulimit -n # is what you would want in the final script that starts rsyslog

ulimit nofile # # is what you would want in the upstart config file. If you try to put the one type inside others, it won't work as expected.

Also, with the upstart config changes, you want to do service rsyslog stop; service rsyslog start, not service rsyslog restart (and you may actually need to reboot, I don't remember) to make sure the new version of the file is in effect.

David Lang


On Tue, 15 Dec 2015, Giles Thomas wrote:

Date: Tue, 15 Dec 2015 20:32:37 +0000
From: Giles Thomas <[email protected]>
Reply-To: rsyslog-users <[email protected]>
To: [email protected]
Subject: [rsyslog] Increasing the number of available file handles in Ubuntu
    14.04

Hi all,

After much battling I've managed to increase the number of file handles available to rsyslog in Ubuntu 14.04. It was significantly harder than you might expect, even given that Ubuntu uses upstart, which does strange stuff with ulimits. So I thought it would be worth sharing the trick that works with the list. Perhaps someone could even explain to me *why* it works :-) Or, even better, tell me a better way to do it. Or both...

Scenario: I wanted to increase the number of available file handles for syslog, because I'm writing to a large number of files via a large number of queues.

Short version: you need to put "ulimit -n 16384" (or whatever) inside /etc/default/rsyslog. The normal way of setting the open file limit for an upstart job (ie. "limit nofile XXX") does not work, at least for me. Putting the ulimit call inside the upstart rsyslog.conf doesn't work either, which is weird (for reasons explained below).

Long version: the default Ubuntu upstart script for starting rsyslog looks like this:

  # rsyslog - system logging daemon
  #
  # rsyslog is an enhanced multi-threaded replacement for the traditional
  # syslog daemon, logging messages from applications

  description     "system logging daemon"

  start on filesystem
  stop on runlevel [06]

  expect fork
  respawn

  pre-start script
       /lib/init/apparmor-profile-load usr.sbin.rsyslogd
  end script

  script
       . /etc/default/rsyslog
       exec rsyslogd $RSYSLOGD_OPTIONS
  end script


Now, upstart does its own ulimit handling, and changes to limits.conf don't affect processes launched by it, so the normal way to increase the number of file handles is to add a line like this just after the "expect fork"/"respawn" bit:

  limit nofile 16384 16384


Indeed, David Lang suggested doing exactly that a couple of months ago in a different thread (archive <http://lists.adiscon.net/pipermail/rsyslog/2015-October/041404.html>).

But, weirdly, it doesn't work, at least for me. Inspecting /proc/<rsyslog-pid>/limits after adding that line and bouncing rsyslog showed that the file handle limit was still 1024 soft, 4096 hard. And I found that my system was not writing to a number of the files it was meant to; "ls /proc/<rsyslog-pid>/fd/ | wc -l" confirmed that it was capping out at 1024 files open.

My first guess was that it's something to do with the fact that Ubuntu's upstart script launches rsyslog via a "script" section. The normal way to start a process in upstart is simply something like

  exec <binary> <options>


...without a "script" block around it. The script block just allows you to add normal shell script to the upstart config so that you can do something more complicated. So, I thought, perhaps the "limit nofile" stuff only works if you're using a simple exec, and for scripts you have to do stuff manually. I added a

  ulimit -n 16384


...inside the script tag.  But that didn't work.

The next thing was investigate *why* the default upstart config uses the script tag. Best guess is that it's there so that the contents of /etc/default/rsyslog can be read, so that configuration options can be placed in that file. Looking inside /etc/default/rsyslog showed that the default file simply contained this:

  # Options for rsyslogd
  # -x disables DNS lookups for remote messages
  # See rsyslogd(8) for more details
  RSYSLOGD_OPTIONS=""


So, this was basically a no-op -- rsyslog was being run with no options by default. Because I hadn't needed to customise it, that meant that I could rewrite the upstart script so that the whole "script...end script" block was replaced by

  exec rsyslogd


If the problem was the script block not playing well with the "limit nofile" option, then you'd think that would work. But it didn't.

By this point (5 days in, working on this intermittently) I was clutching at straws, and as a last ditch attempt I tried reverting back to the original upstart script (so, no "limit nofile" bit, and the original "script...end script" stuff sourcing the file from /etc/default), and put a call to "ulimit -n 16384" inside /etc/default/rsyslog, and restarted rsyslog.

It worked.

This seems really weird to me. I can sort-of-kind-of see why the normal "limit nofile" upstart thing might not work, given that rsyslog forks and daemonises itself, though it seems odd that it does work for other processes (and there's a "expect fork" line in there to tell it to handle that kind of behaviour).

But the fact that the ulimit has to be in /etc/default/rsyslog completely baffles me. If it works when it's in a file that is sourced into the script block, then why does it not work inside the script block directly? I'm pretty sure that in normal shell commands, using "." is basically equivalent to running the commands in the file inside your current shell, one-by-one...

Anyway, I hope the solution is useful to someone out there, and that the (somewhat rambling) explanation is of interest to someone too. And if anyone does know the reason why it works in /etc/default/rsyslog but not in the script block, or knows a better solution to the problem, I'd love to hear!


All the best,

Giles


_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com/professional-services/
What's up with rsyslog? Follow https://twitter.com/rgerhards
NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of 
sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE 
THAT.

Reply via email to