> Lennart Poettering 2016-05-04 18:28:09 CEST ssh-agent starts eating 100% if it gets bombarded by connections, and runs out of file descriptors to use. Looking at strace, it starts to cycle in a select() loop, where the listening AF_UNIX socket is reported active, which makes ssh-agent invoke accept() which will then fail with EMFILE. It will then immediately invoke select() again, and be in a busy loop from then on. I figure ssh-agent should enforce a limit on concurrent connections (that is much lower than RLIMIT_NOFILE) and quickly terminate further incoming connections when that limit is hit. Most internet software handles this that way, and I figure ssh-agent should do that too for incoming local clients. I noticed that while creating a ton of ssh connections to my local system in a tight loop, which uses the ssh keyring. (When ssh-agent is in this mode, and you start further ssh instances with the & suffix in a shell (to make it background), then they will also enter a busy loop handling of SIGTTOU. I don't have further details about this, though, was too lazy to figure out what is really going on there). > Jakub Jelen 2016-05-26 17:01:26 CEST I was trying to burn my virtual box with a lot of requests to ssh-agent but only with partial success. But the behavior you explain sounds possible. My test case: eval `ulimit -n 10; ssh-agent` ssh-add rsa cat rsa.pub >> .ssh/authorized_keys for i in `seq 1 128`; do ssh localhost id & done ls /proc/$SSH_AGENT_PID/fd/ | wc -w and I am left with few cycling ssh processes in some cases, or with the ssh-agent live-locked. ----------------------------------------------------------------------------- Copy from RHBZ#1333105 [1]. I can hack this somehow, but upstream fix with proper evaluation would make more sense, if it is considered as an issue. [1] https://bugzilla.redhat.com/show_bug.cgi?id=1333105
Created attachment 2818 [details] avoid busy-wait on per-process fd exhaustion This patch should fix the bad behaviour on per-process fd exhaustion, but AFAIK ssh-agent will still spin if the system is globally exhausted.
Thank you for a prompt comment and patch. I build a package and tested successfully. I didn't see any more busy loop nor hang.
retarget unfinished bugs to next release
OpenSSH 7.4 release is closing; punt the bugs to 7.5
Move incomplete bugs to openssh-7.6 target since 7.5 shipped a while back. To calibrate expectations, there's little chance all of these are going to make 7.6.
remove 7.5 target
Move to OpenSSH 7.8 tracking bug
Created attachment 3142 [details] updated to current I rewrote ssh-agent's mainloop from select(2) to poll(2) a little while ago. It makes this diff quite a bit simpler.
Fix committed and will be in OpenSSH 7.8 - thanks
Close RESOLVED bugs with the release of openssh-8.0