From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.4 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 796B0C2D0DB for ; Thu, 30 Jan 2020 15:23:21 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 36C66206D3 for ; Thu, 30 Jan 2020 15:23:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="EbbN19Aa" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 36C66206D3 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id C293E6B0369; Thu, 30 Jan 2020 10:23:20 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id BD9196B036B; Thu, 30 Jan 2020 10:23:20 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AC7336B036C; Thu, 30 Jan 2020 10:23:20 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0044.hostedemail.com [216.40.44.44]) by kanga.kvack.org (Postfix) with ESMTP id 95A1D6B0369 for ; Thu, 30 Jan 2020 10:23:20 -0500 (EST) Received: from smtpin04.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 220328248D7C for ; Thu, 30 Jan 2020 15:23:20 +0000 (UTC) X-FDA: 76434669360.04.road61_7446eee4a195e X-HE-Tag: road61_7446eee4a195e X-Filterd-Recvd-Size: 9209 Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by imf23.hostedemail.com (Postfix) with ESMTP for ; Thu, 30 Jan 2020 15:23:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580397798; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=Nz55hXpvLn2zG4weFHRiWt3/tkIIsZZkVGwkBiulPhc=; b=EbbN19AauRnoIoKd9o6+jUHeteIOn/7dVik2GCFPi25lh/hC5+h0Z7CyYrLbgVx2lmYMct 5exITMDTCJbJEYFCt1PBiF4rbIi0DgrlbJLXFVrV/aner0CKIGPF209Vsd7blIk2qBHcGc JEQUQXcvYbUcRW1f9ElYwyxsH0H3nc4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-239-z9VplkafM8-8-ViMJAG-NQ-1; Thu, 30 Jan 2020 10:23:14 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B218E800D50; Thu, 30 Jan 2020 15:23:10 +0000 (UTC) Received: from [10.36.117.231] (ovpn-117-231.ams2.redhat.com [10.36.117.231]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1D2F887B16; Thu, 30 Jan 2020 15:23:05 +0000 (UTC) Subject: Re: Balloon pressuring page cache To: "Michael S. Tsirkin" Cc: Tyler Sanderson , virtualization@lists.linux-foundation.org, Wei Wang , David Rientjes , "linux-mm@kvack.org" , Michal Hocko References: <91270a68-ff48-88b0-219c-69801f0c252f@redhat.com> <75d4594f-0864-5172-a0f8-f97affedb366@redhat.com> <20200130101710-mutt-send-email-mst@kernel.org> From: David Hildenbrand Autocrypt: addr=david@redhat.com; prefer-encrypt=mutual; keydata= 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 Organization: Red Hat GmbH Message-ID: <8c980dc1-0a3e-dc00-c984-7a9ec9563422@redhat.com> Date: Thu, 30 Jan 2020 16:23:05 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.3.1 MIME-Version: 1.0 In-Reply-To: <20200130101710-mutt-send-email-mst@kernel.org> Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-MC-Unique: z9VplkafM8-8-ViMJAG-NQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On 30.01.20 16:20, Michael S. Tsirkin wrote: > On Thu, Jan 30, 2020 at 04:02:34PM +0100, David Hildenbrand wrote: >> On 29.01.20 20:11, Tyler Sanderson wrote: >>> >>> >>> On Wed, Jan 29, 2020 at 2:31 AM David Hildenbrand >> > wrote: >>> >>> On 29.01.20 01:22, Tyler Sanderson via Virtualization wrote: >>> > A primary advantage of virtio balloon over other=C2=A0memory recl= aim >>> > mechanisms is that it can=C2=A0pressure the guest's page cache in= to >>> shrinking. >>> > >>> > However, since the balloon driver changed to using the shrinker A= PI >>> > >>> =C2=A0this >>> > use case has become a bit more tricky. I'm wondering what the int= ended >>> > device implementation is. >>> > >>> > When inflating the balloon against page cache (i.e. no free memor= y >>> > remains) vmscan.c will both shrink page cache, but also invoke th= e >>> > shrinkers -- including the balloon's shrinker. So the balloon dri= ver >>> > allocates memory which requires reclaim, vmscan gets this memory = by >>> > shrinking the balloon, and then the driver adds the memory back t= o the >>> > balloon. Basically a busy no-op. >>> > >>> > If file IO is ongoing during this balloon inflation then the page >>> cache >>> > could be growing which further puts "back pressure" on the balloo= n >>> > trying to inflate. In testing I've seen periods of > 45 seconds w= here >>> > balloon inflation makes no net forward progress. >>> > >>> > This wasn't a problem before the change to the shrinker API since >>> forced >>> > balloon deflation only occurred via the OOM notifier callback >>> which was >>> > invoked only after the page cache had depleted. >>> > >>> > Is this new busy behavior working as intended? >>> >>> Please note that the shrinker will only be registered in case we ha= ve >>> VIRTIO_BALLOON_F_DEFLATE_ON_OOM - (which is AFAIK very rare) - to >>> implement automatic balloon deflation when the guest is under memor= y >>> pressure. >>> >>> >>> Are you actually experiencing issues with that or did you just stum= ble >>> over the code? >>> >>> >>> We have a use case that is encountering this (and that registers >>> DEFLATE_ON_OOM). We can work around this, but it does seem inefficient. >>> I understand there were good reasons for moving away from the OOM >>> notifier callback, but I'm wondering if the balloon driver could specif= y >>> a "nice" level to the shrinker API that would cause it to be reclaimed >>> from only as a last resort? >>> =C2=A0 >> >> Cc-ing linux-mm, Michal and Michael. >=20 >=20 > Interesting. VIRTIO_BALLOON_F_DEFLATE_ON_OOM is really > underspecified in a bunch of ways. >=20 > I'll wait to see what does Michal say from Linux POV. Just wondering, does implying that we are using the shrinker that a echo 3 > /proc/sys/vm/drop_caches Will deflate the whole balloon? If yes, than that's *really* not desired. --=20 Thanks, David / dhildenb From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Hildenbrand Subject: Re: Balloon pressuring page cache Date: Thu, 30 Jan 2020 16:23:05 +0100 Message-ID: <8c980dc1-0a3e-dc00-c984-7a9ec9563422@redhat.com> References: <91270a68-ff48-88b0-219c-69801f0c252f@redhat.com> <75d4594f-0864-5172-a0f8-f97affedb366@redhat.com> <20200130101710-mutt-send-email-mst@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20200130101710-mutt-send-email-mst@kernel.org> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" To: "Michael S. Tsirkin" Cc: Michal Hocko , Tyler Sanderson , "linux-mm@kvack.org" , David Rientjes , virtualization@lists.linux-foundation.org List-Id: virtualization@lists.linuxfoundation.org T24gMzAuMDEuMjAgMTY6MjAsIE1pY2hhZWwgUy4gVHNpcmtpbiB3cm90ZToKPiBPbiBUaHUsIEph biAzMCwgMjAyMCBhdCAwNDowMjozNFBNICswMTAwLCBEYXZpZCBIaWxkZW5icmFuZCB3cm90ZToK Pj4gT24gMjkuMDEuMjAgMjA6MTEsIFR5bGVyIFNhbmRlcnNvbiB3cm90ZToKPj4+Cj4+Pgo+Pj4g T24gV2VkLCBKYW4gMjksIDIwMjAgYXQgMjozMSBBTSBEYXZpZCBIaWxkZW5icmFuZCA8ZGF2aWRA cmVkaGF0LmNvbQo+Pj4gPG1haWx0bzpkYXZpZEByZWRoYXQuY29tPj4gd3JvdGU6Cj4+Pgo+Pj4g ICAgIE9uIDI5LjAxLjIwIDAxOjIyLCBUeWxlciBTYW5kZXJzb24gdmlhIFZpcnR1YWxpemF0aW9u IHdyb3RlOgo+Pj4gICAgID4gQSBwcmltYXJ5IGFkdmFudGFnZSBvZiB2aXJ0aW8gYmFsbG9vbiBv dmVyIG90aGVywqBtZW1vcnkgcmVjbGFpbQo+Pj4gICAgID4gbWVjaGFuaXNtcyBpcyB0aGF0IGl0 IGNhbsKgcHJlc3N1cmUgdGhlIGd1ZXN0J3MgcGFnZSBjYWNoZSBpbnRvCj4+PiAgICAgc2hyaW5r aW5nLgo+Pj4gICAgID4KPj4+ICAgICA+IEhvd2V2ZXIsIHNpbmNlIHRoZSBiYWxsb29uIGRyaXZl ciBjaGFuZ2VkIHRvIHVzaW5nIHRoZSBzaHJpbmtlciBBUEkKPj4+ICAgICA+Cj4+PiAgICAgPGh0 dHBzOi8vZ2l0aHViLmNvbS90b3J2YWxkcy9saW51eC9jb21taXQvNzE5OTQ2MjBiYjI1YThiMTA5 Mzg4ZmVmYTllOTlhMjhlMzU1MjU1YSNkaWZmLWZkMjAyYWNmNjk0ZDllYmExOWM4YzY0ZGEzZTQ4 MGM5PsKgdGhpcwo+Pj4gICAgID4gdXNlIGNhc2UgaGFzIGJlY29tZSBhIGJpdCBtb3JlIHRyaWNr eS4gSSdtIHdvbmRlcmluZyB3aGF0IHRoZSBpbnRlbmRlZAo+Pj4gICAgID4gZGV2aWNlIGltcGxl bWVudGF0aW9uIGlzLgo+Pj4gICAgID4KPj4+ICAgICA+IFdoZW4gaW5mbGF0aW5nIHRoZSBiYWxs b29uIGFnYWluc3QgcGFnZSBjYWNoZSAoaS5lLiBubyBmcmVlIG1lbW9yeQo+Pj4gICAgID4gcmVt YWlucykgdm1zY2FuLmMgd2lsbCBib3RoIHNocmluayBwYWdlIGNhY2hlLCBidXQgYWxzbyBpbnZv a2UgdGhlCj4+PiAgICAgPiBzaHJpbmtlcnMgLS0gaW5jbHVkaW5nIHRoZSBiYWxsb29uJ3Mgc2hy aW5rZXIuIFNvIHRoZSBiYWxsb29uIGRyaXZlcgo+Pj4gICAgID4gYWxsb2NhdGVzIG1lbW9yeSB3 aGljaCByZXF1aXJlcyByZWNsYWltLCB2bXNjYW4gZ2V0cyB0aGlzIG1lbW9yeSBieQo+Pj4gICAg ID4gc2hyaW5raW5nIHRoZSBiYWxsb29uLCBhbmQgdGhlbiB0aGUgZHJpdmVyIGFkZHMgdGhlIG1l bW9yeSBiYWNrIHRvIHRoZQo+Pj4gICAgID4gYmFsbG9vbi4gQmFzaWNhbGx5IGEgYnVzeSBuby1v cC4KPj4+ICAgICA+Cj4+PiAgICAgPiBJZiBmaWxlIElPIGlzIG9uZ29pbmcgZHVyaW5nIHRoaXMg YmFsbG9vbiBpbmZsYXRpb24gdGhlbiB0aGUgcGFnZQo+Pj4gICAgIGNhY2hlCj4+PiAgICAgPiBj b3VsZCBiZSBncm93aW5nIHdoaWNoIGZ1cnRoZXIgcHV0cyAiYmFjayBwcmVzc3VyZSIgb24gdGhl IGJhbGxvb24KPj4+ICAgICA+IHRyeWluZyB0byBpbmZsYXRlLiBJbiB0ZXN0aW5nIEkndmUgc2Vl biBwZXJpb2RzIG9mID4gNDUgc2Vjb25kcyB3aGVyZQo+Pj4gICAgID4gYmFsbG9vbiBpbmZsYXRp b24gbWFrZXMgbm8gbmV0IGZvcndhcmQgcHJvZ3Jlc3MuCj4+PiAgICAgPgo+Pj4gICAgID4gVGhp cyB3YXNuJ3QgYSBwcm9ibGVtIGJlZm9yZSB0aGUgY2hhbmdlIHRvIHRoZSBzaHJpbmtlciBBUEkg c2luY2UKPj4+ICAgICBmb3JjZWQKPj4+ICAgICA+IGJhbGxvb24gZGVmbGF0aW9uIG9ubHkgb2Nj dXJyZWQgdmlhIHRoZSBPT00gbm90aWZpZXIgY2FsbGJhY2sKPj4+ICAgICB3aGljaCB3YXMKPj4+ ICAgICA+IGludm9rZWQgb25seSBhZnRlciB0aGUgcGFnZSBjYWNoZSBoYWQgZGVwbGV0ZWQuCj4+ PiAgICAgPgo+Pj4gICAgID4gSXMgdGhpcyBuZXcgYnVzeSBiZWhhdmlvciB3b3JraW5nIGFzIGlu dGVuZGVkPwo+Pj4KPj4+ICAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzaHJpbmtlciB3aWxsIG9u bHkgYmUgcmVnaXN0ZXJlZCBpbiBjYXNlIHdlIGhhdmUKPj4+ICAgICBWSVJUSU9fQkFMTE9PTl9G X0RFRkxBVEVfT05fT09NIC0gKHdoaWNoIGlzIEFGQUlLIHZlcnkgcmFyZSkgLSB0bwo+Pj4gICAg IGltcGxlbWVudCBhdXRvbWF0aWMgYmFsbG9vbiBkZWZsYXRpb24gd2hlbiB0aGUgZ3Vlc3QgaXMg dW5kZXIgbWVtb3J5Cj4+PiAgICAgcHJlc3N1cmUuCj4+Pgo+Pj4KPj4+ICAgICBBcmUgeW91IGFj dHVhbGx5IGV4cGVyaWVuY2luZyBpc3N1ZXMgd2l0aCB0aGF0IG9yIGRpZCB5b3UganVzdCBzdHVt YmxlCj4+PiAgICAgb3ZlciB0aGUgY29kZT8KPj4+Cj4+Pgo+Pj4gV2UgaGF2ZSBhIHVzZSBjYXNl IHRoYXQgaXMgZW5jb3VudGVyaW5nIHRoaXMgKGFuZCB0aGF0IHJlZ2lzdGVycwo+Pj4gREVGTEFU RV9PTl9PT00pLiBXZSBjYW4gd29yayBhcm91bmQgdGhpcywgYnV0IGl0IGRvZXMgc2VlbSBpbmVm ZmljaWVudC4KPj4+IEkgdW5kZXJzdGFuZCB0aGVyZSB3ZXJlIGdvb2QgcmVhc29ucyBmb3IgbW92 aW5nIGF3YXkgZnJvbSB0aGUgT09NCj4+PiBub3RpZmllciBjYWxsYmFjaywgYnV0IEknbSB3b25k ZXJpbmcgaWYgdGhlIGJhbGxvb24gZHJpdmVyIGNvdWxkIHNwZWNpZnkKPj4+IGEgIm5pY2UiIGxl dmVsIHRvIHRoZSBzaHJpbmtlciBBUEkgdGhhdCB3b3VsZCBjYXVzZSBpdCB0byBiZSByZWNsYWlt ZWQKPj4+IGZyb20gb25seSBhcyBhIGxhc3QgcmVzb3J0Pwo+Pj4gwqAKPj4KPj4gQ2MtaW5nIGxp bnV4LW1tLCBNaWNoYWwgYW5kIE1pY2hhZWwuCj4gCj4gCj4gSW50ZXJlc3RpbmcuICBWSVJUSU9f QkFMTE9PTl9GX0RFRkxBVEVfT05fT09NIGlzIHJlYWxseQo+IHVuZGVyc3BlY2lmaWVkIGluIGEg YnVuY2ggb2Ygd2F5cy4KPiAKPiBJJ2xsIHdhaXQgdG8gc2VlIHdoYXQgZG9lcyBNaWNoYWwgc2F5 IGZyb20gTGludXggUE9WLgoKCkp1c3Qgd29uZGVyaW5nLCBkb2VzIGltcGx5aW5nIHRoYXQgd2Ug YXJlIHVzaW5nIHRoZSBzaHJpbmtlciB0aGF0IGEKCmVjaG8gMyA+IC9wcm9jL3N5cy92bS9kcm9w X2NhY2hlcwoKV2lsbCBkZWZsYXRlIHRoZSB3aG9sZSBiYWxsb29uPyBJZiB5ZXMsIHRoYW4gdGhh dCdzICpyZWFsbHkqIG5vdCBkZXNpcmVkLgoKLS0gClRoYW5rcywKCkRhdmlkIC8gZGhpbGRlbmIK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClZpcnR1YWxp emF0aW9uIG1haWxpbmcgbGlzdApWaXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0aW9u Lm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby92 aXJ0dWFsaXphdGlvbg==