From patchwork Fri Aug 11 16:28:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roesch X-Patchwork-Id: 134602 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b824:0:b0:3f2:4152:657d with SMTP id z4csp1232134vqi; Fri, 11 Aug 2023 10:02:32 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHG/doIssizhjZqS7OnrCLR3iOhOXyiheYwksIipn37pEiZPvAttItETvG8NMSNLtFmTSd4 X-Received: by 2002:a05:6a20:5508:b0:11d:4c79:90ee with SMTP id ko8-20020a056a20550800b0011d4c7990eemr2896566pzb.25.1691773351990; Fri, 11 Aug 2023 10:02:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691773351; cv=none; d=google.com; s=arc-20160816; b=m3iWFb2TsdUqO7qaIVkAHn8K+v6gkJEjaDsvY8erPIeQiXOTU8SRNzyhTS3Z63EioD mWplqUWvdkEM4VofBU2ZN2DnDqYh4kUrHL26zNpAy+B6X9x2SHc92zbYoLuZTY0ebqmh LazUA/bRVwx6Kxr11URvgAd4RGK6kIHDUSuZNgJCcbUa9VDsJmTIqV1I2fWGBgxBrfzB ohF1C61bvNe7A2S4DyFA8f27m/6BwzDSmTJI1c3U0vEOEs8RDLNONmE9UZlXYcu6ReFQ I6EN1pGd6U0cnlZbu0yy/Y2A36+L3ZDvtLIQTGOSJwS7z54rflLYqzRptMPPkQr1WULx 3m2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=NdKa6UdtqrZpOMMOh/nJA+hAWi6NPydLoCg/ottJ1KY=; fh=b5jBeBO35Om38J5KhOUXuzAaPqiHhCpV7eyplgVgWzs=; b=0+J5Haoncg7CMUXEqb9g0arDkv4Pq1JNscKQPqZPFhq5mVf1J7fodIYivzUGa2p+jz s1li0+UWk/7Kuu93AdyUqNWz/w7V2RrTxSs7DuZsWp7lPxvJ3GqabOW1hvVtSwhbb/gb +ZOAGVGQKwAgMaibSabcQjOAHQFco5xBz/BmFJ93MzDJgSQ3QsuWBDE6j6p63PKO02oL DCdTjV9/28ptmwmus5eybsvbZhv3tme3woCQbA4JEszZmmQIphLRnNaiV+Tlo7m9cebZ I8ymw3e3mgUSCL1SrJllIa2v4o+McqFtjZ8RfMoT3jSH4AtkRkERaREpVi4+19aliW0C 8OlA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s21-20020a656915000000b005642a79ae7csi3753203pgq.224.2023.08.11.10.01.58; Fri, 11 Aug 2023 10:02:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235392AbjHKQtJ (ORCPT + 99 others); Fri, 11 Aug 2023 12:49:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233418AbjHKQtC (ORCPT ); Fri, 11 Aug 2023 12:49:02 -0400 X-Greylist: delayed 1240 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Fri, 11 Aug 2023 09:49:00 PDT Received: from 66-220-144-179.mail-mxout.facebook.com (66-220-144-179.mail-mxout.facebook.com [66.220.144.179]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8CACC30C1 for ; Fri, 11 Aug 2023 09:49:00 -0700 (PDT) Received: by devbig1114.prn1.facebook.com (Postfix, from userid 425415) id DC108A076222; Fri, 11 Aug 2023 09:28:06 -0700 (PDT) From: Stefan Roesch To: kernel-team@fb.com Cc: shr@devkernel.io, akpm@linux-foundation.org, david@redhat.com, linux-fsdevel@vger.kernel.org, hannes@cmpxchg.org, riel@surriel.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v2] proc/ksm: add ksm stats to /proc/pid/smaps Date: Fri, 11 Aug 2023 09:28:03 -0700 Message-Id: <20230811162803.1361989-1-shr@devkernel.io> X-Mailer: git-send-email 2.39.3 MIME-Version: 1.0 X-Spam-Status: No, score=-0.1 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_BLOCKED,RDNS_DYNAMIC,SPF_HELO_PASS,SPF_NEUTRAL, TVD_RCVD_IP autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1773952934504357713 X-GMAIL-MSGID: 1773952934504357713 With madvise and prctl KSM can be enabled for different VMA's. Once it is enabled we can query how effective KSM is overall. However we cannot easily query if an individual VMA benefits from KSM. This commit adds a KSM section to the /prod//smaps file. It reports how many of the pages are KSM pages. Here is a typical output: 7f420a000000-7f421a000000 rw-p 00000000 00:00 0 Size: 262144 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Rss: 51212 kB Pss: 8276 kB Shared_Clean: 172 kB Shared_Dirty: 42996 kB Private_Clean: 196 kB Private_Dirty: 7848 kB Referenced: 15388 kB Anonymous: 51212 kB KSM: 41376 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB FilePmdMapped: 0 kB Shared_Hugetlb: 0 kB Private_Hugetlb: 0 kB Swap: 202016 kB SwapPss: 3882 kB Locked: 0 kB THPeligible: 0 ProtectionKey: 0 ksm_state: 0 ksm_skip_base: 0 ksm_skip_count: 0 VmFlags: rd wr mr mw me nr mg anon This information also helps with the following workflow: - First enable KSM for all the VMA's of a process with prctl. - Then analyze with the above smaps report which VMA's benefit the most - Change the application (if possible) to add the corresponding madvise calls for the VMA's that benefit the most Signed-off-by: Stefan Roesch --- Documentation/filesystems/proc.rst | 3 +++ fs/proc/task_mmu.c | 5 +++++ 2 files changed, 8 insertions(+) base-commit: f4a280e5bb4a764a75d3215b61bc0f02b4c26417 diff --git a/Documentation/filesystems/proc.rst b/Documentation/filesystems/proc.rst index 7897a7dafcbc..4ef3c0bbf16a 100644 --- a/Documentation/filesystems/proc.rst +++ b/Documentation/filesystems/proc.rst @@ -461,6 +461,7 @@ Memory Area, or VMA) there is a series of lines such as the following:: Private_Dirty: 0 kB Referenced: 892 kB Anonymous: 0 kB + KSM: 0 kB LazyFree: 0 kB AnonHugePages: 0 kB ShmemPmdMapped: 0 kB @@ -501,6 +502,8 @@ accessed. a mapping associated with a file may contain anonymous pages: when MAP_PRIVATE and a page is modified, the file page is replaced by a private anonymous copy. +"KSM" shows the amount of anonymous memory that has been de-duplicated. + "LazyFree" shows the amount of memory which is marked by madvise(MADV_FREE). The memory isn't freed immediately with madvise(). It's freed in memory pressure if the memory is clean. Please note that the printed value might diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 51315133cdc2..f591c750ffda 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -396,6 +396,7 @@ struct mem_size_stats { unsigned long swap; unsigned long shared_hugetlb; unsigned long private_hugetlb; + unsigned long ksm; u64 pss; u64 pss_anon; u64 pss_file; @@ -452,6 +453,9 @@ static void smaps_account(struct mem_size_stats *mss, struct page *page, mss->lazyfree += size; } + if (PageKsm(page)) + mss->ksm += size; + mss->resident += size; /* Accumulate the size in pages that have been accessed. */ if (young || page_is_young(page) || PageReferenced(page)) @@ -822,6 +826,7 @@ static void __show_smap(struct seq_file *m, const struct mem_size_stats *mss, SEQ_PUT_DEC(" kB\nPrivate_Dirty: ", mss->private_dirty); SEQ_PUT_DEC(" kB\nReferenced: ", mss->referenced); SEQ_PUT_DEC(" kB\nAnonymous: ", mss->anonymous); + SEQ_PUT_DEC(" kB\nKSM: ", mss->ksm); SEQ_PUT_DEC(" kB\nLazyFree: ", mss->lazyfree); SEQ_PUT_DEC(" kB\nAnonHugePages: ", mss->anonymous_thp); SEQ_PUT_DEC(" kB\nShmemPmdMapped: ", mss->shmem_thp);