From owner-svn-src-user@freebsd.org Mon May 23 05:28:04 2016 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3E8C2B460A6 for ; Mon, 23 May 2016 05:28:04 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0FE9619DF; Mon, 23 May 2016 05:28:03 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u4N5S3H2088159; Mon, 23 May 2016 05:28:03 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u4N5S34B088158; Mon, 23 May 2016 05:28:03 GMT (envelope-from markj@FreeBSD.org) Message-Id: <201605230528.u4N5S34B088158@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Mon, 23 May 2016 05:28:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r300465 - user/alc/PQ_LAUNDRY/sys/vm X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 May 2016 05:28:04 -0000 Author: markj Date: Mon May 23 05:28:03 2016 New Revision: 300465 URL: https://svnweb.freebsd.org/changeset/base/300465 Log: Address over-eager OOM kills. Prior to this change, vm_page_free_wakeup() and thus vm_page_free() would clear vm_pages_needed when the free page count is above v_free_min. If the pagedaemon is starved for pages to reclaim because of a runaway process or because all inactive pages are dirty, but other threads are occasionally freeing pages, and v_free_min <= v_free_count <= vm_pageout_wakeup_thresh, concurrent vm_page_free() and vm_page_alloc() calls will respectively clear and set vm_pages_needed, waking up the pagedaemon in the process. This can cause the domain's oom_seq value to increment very quickly, leading to a spurious OOM kill when the pagedaemon cannot find clean pages to reclaim in the time that it takes for some pages to be laundered. This can be triggered during multiple consecutive sysbench runs when it writes mmap'ed files that are larger than system memory. Fix the problem by modifying vm_page_free_wakeup() to only clear vm_pages_needed once v_free_count has risen above vm_pageout_wakeup_thresh. Reviewed by: alc Modified: user/alc/PQ_LAUNDRY/sys/vm/vm_page.c Modified: user/alc/PQ_LAUNDRY/sys/vm/vm_page.c ============================================================================== --- user/alc/PQ_LAUNDRY/sys/vm/vm_page.c Mon May 23 05:28:02 2016 (r300464) +++ user/alc/PQ_LAUNDRY/sys/vm/vm_page.c Mon May 23 05:28:03 2016 (r300465) @@ -2910,7 +2910,8 @@ vm_page_free_wakeup(void) * lots of memory. this process will swapin processes. */ if (vm_pages_needed && !vm_page_count_min()) { - vm_pages_needed = 0; + if (!vm_paging_needed()) + vm_pages_needed = 0; wakeup(&vm_cnt.v_free_count); } }