NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/54727: writing a large file causes unreasonable system behaviour



On Mon, Dec 09, 2019 at 11:25:01AM +0000, J. Hannken-Illjes wrote:

>  This happens for me too.  Looks like:
>  
>  - we are low on memory.
>  - nearly all pages are active and belong to ONE vnode (the large file
>    we are currently creating).
>  - pagedaemon ends up in uvmpdpol_balancequeue() to increase the number
>    of inactive pages.
>  - often the one vnode v_interlock is held by another thread
>    so uvmpd_trylockowner(p) fails for nearly all active pages.
>  
>  - the pagedaemon starts busy looping until it finds this vnode
>    unlocked and everything proceeds.

I agree with this assessment.  It looks very likely to me.  In addition to
v_interlock being busy simply due to legitimate activity, with more than one
CPU the lock pressure here can be immense because of the pagedaemon itself:

	pagedaemon holds uvm_pageqlock and is pondering deeply

		-> tries to acquire v_interlock in relation to
		   a specific single page (reasonable enough thing
		   to try), keeps retrying

	busily writing process holds v_interlock

		-> is already waiting on uvm_pageqlock for uvm_page*(),
		   in relation to a totally different page (unreasonable)

The UVM locking changes I have may help with this, because it may be
possible for for the pagedaemon to drop the replacement for uvm_pageqlock
while it is trying to acquire the uobject lock.  In other words, for the
duration of the reverse locking dance, the pagedaemon's bothersome
activities would be confined to a single page, which would allow the writing
process a chance to continue its work with other pages and drop the uobject
lock.  Those will hopefully be ready for review later today.

(That's no use for 9.0 though.)

Andrew


Home | Main Index | Thread Index | Old Index