<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri","sans-serif";}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">(Thanks for the tip that helped lead to the dlclose() solution.)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Now, I'm running into an issue where the exec plugin's child process hangs in a call to getpwname_r() from inside exec_child(). The hang happens reliably if I use upstart to start collectdmon, which starts collectd. If I manually start
collectdmon, everything works the way it is supposed to. (This hang happened even before I added the dlclose() patch, and it happens earlier in exec_child() than anything done by the dlclose() patch.) This is with collectd 5.2.0 on Ubuntu 12.04LTS. The
'top' command reports 32 logical cpus. I have only one item that the exec plugin should be calling. If I gather correctly, my getpwnam_r() comes from Glibc, not from the ifdef'ed function in common.c. It appears this issue may be related to the following
issues:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><a href="http://mailman.verplant.org/pipermail/collectd/2010-March/003650.html">http://mailman.verplant.org/pipermail/collectd/2010-March/003650.html</a><o:p></o:p></p>
<p class="MsoNormal"><a href="https://github.com/collectd/collectd/issues/229">https://github.com/collectd/collectd/issues/229</a><o:p></o:p></p>
<p class="MsoNormal"><a href="https://gist.github.com/jessereynolds/2878994">https://gist.github.com/jessereynolds/2878994</a><o:p></o:p></p>
<p class="MsoNormal"><a href="http://www.mail-archive.com/collectd@verplant.org/msg00524.html">http://www.mail-archive.com/collectd@verplant.org/msg00524.html</a><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">and possibly<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><a href="http://monkey.org/freebsd/archive/freebsd-threads/200307/msg00110.html">http://monkey.org/freebsd/archive/freebsd-threads/200307/msg00110.html</a><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here's the output of strace on a hung child process:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Process 2435 attached - interrupt to quit<o:p></o:p></p>
<p class="MsoNormal">futex(0x7fd431c3cdb0, FUTEX_WAIT_PRIVATE, 2, NULL<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here's the output of the gdb 'where' command on a hung child process:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(gdb) where<o:p></o:p></p>
<p class="MsoNormal">#0 0x00007fcf120d09bb in ?? () from /lib/x86_64-linux-gnu/libc.so.6<o:p></o:p></p>
<p class="MsoNormal">#1 0x00007fcf120d591c in ?? () from /lib/x86_64-linux-gnu/libc.so.6<o:p></o:p></p>
<p class="MsoNormal">#2 0x00007fcf120d4f2b in __nss_database_lookup ()<o:p></o:p></p>
<p class="MsoNormal"> from /lib/x86_64-linux-gnu/libc.so.6<o:p></o:p></p>
<p class="MsoNormal">#3 0x00007fcf120d630c in __nss_passwd_lookup2 ()<o:p></o:p></p>
<p class="MsoNormal"> from /lib/x86_64-linux-gnu/libc.so.6<o:p></o:p></p>
<p class="MsoNormal">#4 0x00007fcf1208dac8 in getpwnam_r () from /lib/x86_64-linux-gnu/libc.so.6<o:p></o:p></p>
<p class="MsoNormal">#5 0x00007fcf0c6e38ed in exec_child (pl=0x18e5e90) at exec.c:303<o:p></o:p></p>
<p class="MsoNormal">#6 fork_child (pl=0x18e5e90, fd_in=<optimized out>, fd_out=<optimized out>,
<o:p></o:p></p>
<p class="MsoNormal"> fd_err=0x7fcf09aca5e8) at exec.c:509<o:p></o:p></p>
<p class="MsoNormal">#7 0x00007fcf0c6e3f5e in exec_read_one (arg=0x18e5e90) at exec.c:560<o:p></o:p></p>
<p class="MsoNormal">#8 0x00007fcf12599e9a in start_thread ()<o:p></o:p></p>
<p class="MsoNormal"> from /lib/x86_64-linux-gnu/libpthread.so.0<o:p></o:p></p>
<p class="MsoNormal">#9 0x00007fcf120c2cbd in clone () from /lib/x86_64-linux-gnu/libc.so.6<o:p></o:p></p>
<p class="MsoNormal">#10 0x0000000000000000 in ?? ()<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(I could compile with --enable-debug, but that's a significant effort and it doesn't appear it would add much info at this point.)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here's /proc/$pid/status for a hung child process:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Name: collectd<o:p></o:p></p>
<p class="MsoNormal">State: S (sleeping)<o:p></o:p></p>
<p class="MsoNormal">Tgid: 128026<o:p></o:p></p>
<p class="MsoNormal">Pid: 128026<o:p></o:p></p>
<p class="MsoNormal">PPid: 128018<o:p></o:p></p>
<p class="MsoNormal">TracerPid: 0<o:p></o:p></p>
<p class="MsoNormal">Uid: 0 0 0 0<o:p></o:p></p>
<p class="MsoNormal">Gid: 0 0 0 0<o:p></o:p></p>
<p class="MsoNormal">FDSize: 64<o:p></o:p></p>
<p class="MsoNormal">Groups:<o:p></o:p></p>
<p class="MsoNormal">VmPeak: 624472 kB<o:p></o:p></p>
<p class="MsoNormal">VmSize: 624472 kB<o:p></o:p></p>
<p class="MsoNormal">VmLck: 0 kB<o:p></o:p></p>
<p class="MsoNormal">VmPin: 0 kB<o:p></o:p></p>
<p class="MsoNormal">VmHWM: 1484 kB<o:p></o:p></p>
<p class="MsoNormal">VmRSS: 1484 kB<o:p></o:p></p>
<p class="MsoNormal">VmData: 516584 kB<o:p></o:p></p>
<p class="MsoNormal">VmStk: 136 kB<o:p></o:p></p>
<p class="MsoNormal">VmExe: 164 kB<o:p></o:p></p>
<p class="MsoNormal">VmLib: 10916 kB<o:p></o:p></p>
<p class="MsoNormal">VmPTE: 268 kB<o:p></o:p></p>
<p class="MsoNormal">VmSwap: 0 kB<o:p></o:p></p>
<p class="MsoNormal">Threads: 1<o:p></o:p></p>
<p class="MsoNormal">SigQ: 5/256851<o:p></o:p></p>
<p class="MsoNormal">SigPnd: 0000000000000000<o:p></o:p></p>
<p class="MsoNormal">ShdPnd: 0000000000000000<o:p></o:p></p>
<p class="MsoNormal">SigBlk: 0000000000000000<o:p></o:p></p>
<p class="MsoNormal">SigIgn: 0000000000001000<o:p></o:p></p>
<p class="MsoNormal">SigCgt: 0000000180014202<o:p></o:p></p>
<p class="MsoNormal">CapInh: 0000000000000000<o:p></o:p></p>
<p class="MsoNormal">CapPrm: ffffffffffffffff<o:p></o:p></p>
<p class="MsoNormal">CapEff: ffffffffffffffff<o:p></o:p></p>
<p class="MsoNormal">CapBnd: ffffffffffffffff<o:p></o:p></p>
<p class="MsoNormal">Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff<o:p></o:p></p>
<p class="MsoNormal">Cpus_allowed_list: 0-127<o:p></o:p></p>
<p class="MsoNormal">Mems_allowed: 00000000,00000003<o:p></o:p></p>
<p class="MsoNormal">Mems_allowed_list: 0-1<o:p></o:p></p>
<p class="MsoNormal">voluntary_ctxt_switches: 9<o:p></o:p></p>
<p class="MsoNormal">nonvoluntary_ctxt_switches: 0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Some documents on the web said getpwnam_r() could hang if using NIS or LDAP. Here's my /etc/nsswitch.conf:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># /etc/nsswitch.conf<o:p></o:p></p>
<p class="MsoNormal">#<o:p></o:p></p>
<p class="MsoNormal"># Example configuration of GNU Name Service Switch functionality.<o:p></o:p></p>
<p class="MsoNormal"># If you have the `glibc-doc-reference' and `info' packages installed, try:<o:p></o:p></p>
<p class="MsoNormal"># `info libc "Name Service Switch"' for information about this file.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">passwd: compat<o:p></o:p></p>
<p class="MsoNormal">group: compat<o:p></o:p></p>
<p class="MsoNormal">shadow: compat<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">hosts: files dns<o:p></o:p></p>
<p class="MsoNormal">networks: files<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">protocols: db files<o:p></o:p></p>
<p class="MsoNormal">services: db files<o:p></o:p></p>
<p class="MsoNormal">ethers: db files<o:p></o:p></p>
<p class="MsoNormal">rpc: db files<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">netgroup: nis<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If I gather correctly, 'compat' for the passwd, group, and shadow entries should be equivalent to 'files' if there are no exception items. The 'netgroup: nis' entry is apparently from the stock Ubuntu installation. As far as I am aware,
there is no NIS active for this machine.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Is anyone here acquainted with reasons getpwnam_r() might hang and/or a better solution than adding a 'sleep(1)' mentioned in a reference URL? (It's likely a sleep wouldn't help my case, because I only have one thing called by the exec
plugin.)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Robert Riches<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>