Linus Torvalds writes: (Summary) Your
wake_up_page_bit() profile made me suspect that, but this one seems to
pretty much confirm it.
pretty much confirm it.
So it looks like that wait_on_page_locked() thing in __migration_entry_wait(), and what probably happens is that your load ends up triggering a lot of migration (or just migration of a very hot page), and then *every* thread ends up waiting for whatever page that ended up getting migrated.
ended up getting migrated.
And so the wait queue for that page grows hugely long. Looking at the other profile, the thing that is locking the page (that everybody then ends up waiting on) would seem to be migrate_misplaced_transhuge_page(), so this is _presumably_ due to NUMA balancing.
NUMA balancing.
Does the problem go away if you disable the NUMA balancing code?
pretty much confirm it.
So it looks like that wait_on_page_locked() thing in __migration_entry_wait(), and what probably happens is that your load ends up triggering a lot of migration (or just migration of a very hot page), and then *every* thread ends up waiting for whatever page that ended up getting migrated.
ended up getting migrated.
And so the wait queue for that page grows hugely long. Looking at the other profile, the thing that is locking the page (that everybody then ends up waiting on) would seem to be migrate_misplaced_transhuge_page(), so this is _presumably_ due to NUMA balancing.
NUMA balancing.
Does the problem go away if you disable the NUMA balancing code?