This is the mail archive of the gdb-prs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

threads/2047: On Linux 2.4, it's better to attach all threads before calling waitpid on any


>Number:         2047
>Category:       threads
>Synopsis:       On Linux 2.4, it's better to attach all threads before calling waitpid on any
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Mon Dec 05 14:58:01 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Michael.Zraly@openwave.com
>Release:        GNU gdb 6.3
>Organization:
>Environment:
Linux email-devlnx08 2.4.21-9.ELsmp #1 SMP Thu Jan 8 17:08:56 EST 2004 i686 i686 i386 GNU/Linux

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-24)

This GDB was configured as "i686-pc-linux-gnu".

>Description:
When attaching to a multi-threaded process on GNU/Linux 2.4, gdb uses an algorithm like this:

for each thread t { attach(t); waitpid(t); }

The waitpid() seems to cause gdb to yield the CPU for other tasks to run, including the as yet unattached thread processes of the inferior process.  Assuming pure round-robin scheduling, this implies that when attaching to a process with N threads, gdb will have to wait for N-1 time slices after the first call to waitpid(), N-2 after the second, ... for a total of N(N-1)/2 time slices of the inferior process's threads.  If N is large and the threads are CPU-intensive (so they use the whole time slice), then this can be a significant amount of time.  For example, assuming a 50ms time slice, or 20 slices per second, and a 600 thread process, it may take up to (600(599)/2)/20 seconds -- that's 8,985 seconds, more than 2 hours.

If instead one uses this algorithm:

for each thread t { attach(t); }
for each thread t { waitpid(t); }

then the inferior process's threads are stopped before gdb yields the CPU (barring scheduled pre-emption) and the total elapsed time to complete attaching to all the threads is much less.

To demonstrate this, I wrote a test program that displays the elapsed time to attach to all the threads in a given process.  Given a pid argument and no options, it uses the current gdb algorithm.  Given a pid argument preceded by the "-a" option, it uses the alternate algorithm of attaching all, then calling waitpid on all.  I ran this against our company's MTA under various loads.  The test program and a plot of the results are in the attached zip file.  In this example, the total time taken to attach to all the threads is still small, but these threads tend to be I/O bound, so they tend to relinquish the CPU well before their time slice has expired.
>How-To-Repeat:
On GNU/Linux 2.4, attach to a running process with several hundred threads where most of the threads are CPU bound.
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/x-zip-compressed; name="ptrace_test.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="ptrace_test.zip"

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
BgAAAAACAAIAlwAAAF4oAAAAAA==


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]