When stuck in eviction, re-check if a thread should be in "busy" mode.  Be consistent about the eviction target: when on an API boundary, wait until there is 5% cache available.
Tweak eviction: wait longer if not busy, but not for a specific cache target: some threads may get stuck doing eviction while other threads keep reading pages.  Also spin a few times before waiting on a condition variable: the latter is slow.