too many futex syscalls
Bug #140834 reported by
Martin Pool
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Bazaar |
Confirmed
|
Medium
|
Unassigned |
Bug Description
strace on bzr reveals we do many futex syscalls during typical operations.
It's believed, but not certain, that this is due to non-top-level import statements, for which Python uses an 'import lock' separate from the GIL. Moving them to top-level imports, or lazy imports, or at least into less-hot functions may help, and may reduce overhead in other ways.
It's also surprising that we're seeing futex calls at all, since they are documented (futex(7)) to be entirely in userspace when uncontested. This may mean that there actually is contention on the lock from some other thread, or that there is a bug in how Python is using the futex.
Changed in bzr: | |
importance: | Undecided → Medium |
status: | New → Triaged |
Changed in bzr: | |
status: | Triaged → Confirmed |
tags: | added: performance |
tags: | added: check-for-breezy |
tags: | removed: check-for-breezy |
To post a comment you must log in.
A simple invocation of python shows them apparently being hit at startup and on imports:
mbp@hope% strace -e trace=futex python -c import\ pdb -c import\ pdb
futex(0x816a048, FUTEX_WAKE, 1) = 0
futex(0x816a048, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x818bd00, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0xb7e98a6c, FUTEX_WAKE, 2147483647) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0xb7ec9070, FUTEX_WAKE, 2147483647) = 0
futex(0x8171df8, FUTEX_WAKE, 1) = 0
futex(0x818bd00, FUTEX_WAKE, 1) = 0
futex(0x816a048, FUTEX_WAKE, 1) = 0
futex(0x816a048, FUTEX_WAKE, 1) = 0
futex(0x816a048, FUTEX_WAKE, 1) = 0
mbp@hope% strace -e trace=futex python
futex(0x816a038, FUTEX_WAKE, 1) = 0
futex(0x816a038, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x818bcf0, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0xb7f76a6c, FUTEX_WAKE, 2147483647) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
Python 2.5.1 (r251:54863, Sep 11 2007, 23:45:37)
[GCC 4.1.3 20070831 (prerelease) (Ubuntu 4.1.2-16ubuntu1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
futex(0x8171de8, FUTEX_WAKE, 1) = 0
futex(0xb7fa7070, FUTEX_WAKE, 2147483647) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
>>> import pdb
futex(0x81cbb98, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
>>> import pdb
futex(0x81cbb98, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
>>> import pdb
futex(0x81cbb98, FUTEX_WAKE, 1) = 0
futex(0x8171de8, FUTEX_WAKE, 1) = 0
>>> futex(0x81cbb98, FUTEX_WAKE, 1) = 0
futex(0x818bcf0, FUTEX_WAKE, 1) = 0
futex(0x816a038, FUTEX_WAKE, 1) = 0
futex(0x816a038, FUTEX_WAKE, 1) = 0
futex(0x816a038, FUTEX_WAKE, 1) = 0
Process 7104 detached
note that in the second case we can't be 100% sure this is due to the import rather than some consequence of the interactive session.