From patchwork Wed Dec 16 08:43:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 11976957 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=-18.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT 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 5557EC4361B for ; Wed, 16 Dec 2020 08:44:59 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 9C45D20735 for ; Wed, 16 Dec 2020 08:44:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9C45D20735 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=amazon.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id C65926B005D; Wed, 16 Dec 2020 03:44:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C17716B006C; Wed, 16 Dec 2020 03:44:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B2C726B006E; Wed, 16 Dec 2020 03:44:57 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0239.hostedemail.com [216.40.44.239]) by kanga.kvack.org (Postfix) with ESMTP id 9E70B6B005D for ; Wed, 16 Dec 2020 03:44:57 -0500 (EST) Received: from smtpin07.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 5E4B1180AD81D for ; Wed, 16 Dec 2020 08:44:57 +0000 (UTC) X-FDA: 77598510234.07.blood36_4d0a6a82742a Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin07.hostedemail.com (Postfix) with ESMTP id 40DF51803F9A1 for ; Wed, 16 Dec 2020 08:44:57 +0000 (UTC) X-HE-Tag: blood36_4d0a6a82742a X-Filterd-Recvd-Size: 11897 Received: from smtp-fw-6002.amazon.com (smtp-fw-6002.amazon.com [52.95.49.90]) by imf41.hostedemail.com (Postfix) with ESMTP for ; Wed, 16 Dec 2020 08:44:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1608108297; x=1639644297; h=from:to:cc:subject:date:message-id:mime-version; bh=jGd3IHZtvo+hUqdl34pPlfX1XZZIx6RKYvIrj+lPFqo=; b=jwjHhj6cw0PmLAilcywlvxKIA+yxuijsVdrufWBop6TEA5DyYxnOvomg OqJMpYbV99cKlGfGTGcxve1XIoLMR9Yu3nlD2s17SiSUe82/7yOLwkxER h7+kbfn58ubAYddvw2vfUpYl9hgJk3UwPfcciCX/psFQqlIHE+rtpzgqA 4=; X-IronPort-AV: E=Sophos;i="5.78,424,1599523200"; d="scan'208";a="71552743" Received: from iad12-co-svc-p1-lb1-vlan2.amazon.com (HELO email-inbound-relay-1d-16425a8d.us-east-1.amazon.com) ([10.43.8.2]) by smtp-border-fw-out-6002.iad6.amazon.com with ESMTP; 16 Dec 2020 08:44:49 +0000 Received: from EX13D31EUA001.ant.amazon.com (iad12-ws-svc-p26-lb9-vlan3.iad.amazon.com [10.40.163.38]) by email-inbound-relay-1d-16425a8d.us-east-1.amazon.com (Postfix) with ESMTPS id 58FF1101080; Wed, 16 Dec 2020 08:44:37 +0000 (UTC) Received: from u3f2cd687b01c55.ant.amazon.com (10.43.161.102) by EX13D31EUA001.ant.amazon.com (10.43.165.15) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 16 Dec 2020 08:44:20 +0000 From: SeongJae Park To: CC: SeongJae Park , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC v15.1 0/8] Implement Data Access Monitoring-based Memory Operation Schemes Date: Wed, 16 Dec 2020 09:43:56 +0100 Message-ID: <20201216084404.23183-1-sjpark@amazon.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 X-Originating-IP: [10.43.161.102] X-ClientProxiedBy: EX13D22UWB003.ant.amazon.com (10.43.161.76) To EX13D31EUA001.ant.amazon.com (10.43.165.15) 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: From: SeongJae Park NOTE: This is only an RFC for future features of DAMON patchset[1], which is not merged in the mainline yet. The aim of this RFC is to show how DAMON would be evolved once it is merged in. So, if you have some interest in this RFC, please consider reviewing the DAMON patchset, either. Changes from Previous Version ============================= Only below minor changes made on v15 of this patchset. Therefore I'm setting the version number to v15.1 rather than v16. - Rebase on v5.10 + DAMON v23[1] - Drop the dependency on Minchan's out-of-tree patch (It's merged in v5.10) Introduction ============ DAMON[1] can be used as a primitive for data access aware memory management optimizations. For that, users who want such optimizations should run DAMON, read the monitoring results, analyze it, plan a new memory management scheme, and apply the new scheme by themselves. Such efforts will be inevitable for some complicated optimizations. However, in many other cases, the users would simply want the system to apply a memory management action to a memory region of a specific size having a specific access frequency for a specific time. For example, "page out a memory region larger than 100 MiB keeping only rare accesses more than 2 minutes", or "Do not use THP for a memory region larger than 2 MiB rarely accessed for more than 1 seconds". This RFC patchset makes DAMON to handle such data access monitoring-based Operation Schemes (DAMOS). With this change, users can do the data access aware optimizations by simply specifying their schemes. [1] https://lore.kernel.org/linux-mm/20201215115448.25633-1-sjpark@amazon.com Evaluations =========== We evaluated DAMON's overhead, monitoring quality and usefulness using 24 realistic workloads on my QEMU/KVM based virtual machine running a kernel that v23 DAMON patchset is applied. DAMON is lightweight. It increases system memory usage by 0.42% and slows target workloads down by 0.39%. DAMON is accurate and useful for memory management optimizations. An experimental DAMON-based operation scheme for THP, 'ethp', removes 81.45% of THP memory overheads while preserving 50.09% of THP speedup. Another experimental DAMON-based 'proactive reclamation' implementation, 'prcl', reduces 91.45% of residential sets and 22.91% of system memory footprint while incurring only 2.43% runtime overhead in the best case (parsec3/freqmine). NOTE that the experimental THP optimization and proactive reclamation are not for production but only for proof of concepts. Please refer to the official document[1] or "Documentation/admin-guide/mm: Add a document for DAMON" patch in this patchset for detailed evaluation setup and results. [1] https://damonitor.github.io/doc/html/latest-damon/admin-guide/mm/damon/eval.html More Information ================ We prepared a showcase web site[1] that you can get more information. There are - the official documentations[2], - the heatmap format dynamic access pattern of various realistic workloads for heap area[3], mmap()-ed area[4], and stack[5] area, - the dynamic working set size distribution[6] and chronological working set size changes[7], and - the latest performance test results[8]. [1] https://damonitor.github.io/_index [2] https://damonitor.github.io/doc/html/latest-damos [3] https://damonitor.github.io/test/result/visual/latest/rec.heatmap.0.html [4] https://damonitor.github.io/test/result/visual/latest/rec.heatmap.1.html [5] https://damonitor.github.io/test/result/visual/latest/rec.heatmap.2.html [6] https://damonitor.github.io/test/result/visual/latest/rec.wss_sz.html [7] https://damonitor.github.io/test/result/visual/latest/rec.wss_time.html [8] https://damonitor.github.io/test/result/perf/latest/html/index.html Baseline and Complete Git Tree ============================== The patches are based on the v5.10 plus v23 DAMON patchset[1]. You can also clone the complete git tree: $ git clone git://github.com/sjp38/linux -b damos/rfc/v15.1 The web is also available: https://github.com/sjp38/linux/releases/tag/damos/rfc/v15.1 There are a couple of trees for entire DAMON patchset series that future features are included. The first one[3] contains the changes for latest release, while the other one[4] contains the changes for next release. [1] https://lore.kernel.org/linux-doc/20201005105522.23841-1-sjpark@amazon.com/ [2] https://lore.kernel.org/linux-mm/20200302193630.68771-2-minchan@kernel.org/ [3] https://github.com/sjp38/linux/tree/damon/master [4] https://github.com/sjp38/linux/tree/damon/next Sequence Of Patches =================== The 1st patch accounts age of each region. The 2nd patch implements the core of the DAMON-based operation schemes feature. The 3rd patch makes the default monitoring primitives for virtual address spaces to support the schemes. From this point, the kernel space users can use DAMOS. The 4th patch exports the feature to the user space via the debugfs interface. The 5th patch implements schemes statistics feature for easier tuning of the schemes and runtime access pattern analysis. The 6th patch adds selftests for these changes, and the 7th patch adds human friendly schemes support to the user space tool for DAMON. Finally, the 8th patch documents this new feature. Patch History ============= Changes from RFC v15 (https://lore.kernel.org/linux-mm/20201006123931.5847-1-sjpark@amazon.com/) - Rebase on v5.10 + DAMON v23[1] - Drop the dependency on Minchan's out-of-tree patch (It's merged in v5.10) Changes from RFC v14 (https://lore.kernel.org/linux-mm/20200804142430.15384-1-sjpark@amazon.com/) - s/snprintf()/scnprintf() (Marco Elver) - Place three parts of DAMON (core, primitives, and dbgfs) in different files Changes from RFC v13 (https://lore.kernel.org/linux-mm/20200707093805.4775-1-sjpark@amazon.com/) - Drop loadable module support - Use dedicated valid action checker function - Rebase on v5.8 plus v19 DAMON Changes from RFC v12 (https://lore.kernel.org/linux-mm/20200616073828.16509-1-sjpark@amazon.com/) - Wordsmith the document, comment, commit messages - Support a scheme of max access count 0 - Use 'unsigned long' for (min|max)_sz_region Changes from RFC v11 (https://lore.kernel.org/linux-mm/20200609065320.12941-1-sjpark@amazon.com/) - Refine the commit messages (David Hildenbrand) - Clean up debugfs code Changes from RFC v10 (https://lore.kernel.org/linux-mm/20200603071138.8152-1-sjpark@amazon.com/) - Fix the wrong error handling for schemes debugfs file - Handle the schemes stats from the user space tool - Remove the schemes implementation plan from the document Changes from RFC v9 (https://lore.kernel.org/linux-mm/20200526075702.27339-1-sjpark@amazon.com/) - Rebase on v5.7 - Fix wrong comments and documents for schemes apply conditions Changes from RFC v8 (https://lore.kernel.org/linux-mm/20200512115343.27699-1-sjpark@amazon.com/) - Rewrite the document (Stefan Nuernberger) - Make 'damon_for_each_*' argument order consistent (Leonard Foerster) - Implement statistics for schemes - Avoid races between debugfs readers and writers - Reset age for only significant access frequency changes - Add kernel-doc comments in damon.h Please refer to RFC v8 for previous history SeongJae Park (8): mm/damon/core: Account age of target regions mm/damon/core: Implement DAMON-based Operation Schemes (DAMOS) mm/damon/vaddr: Support DAMON-based Operation Schemes mm/damon/dbgfs: Support DAMON-based Operation Schemes mm/damon/schemes: Implement statistics feature selftests/damon: Add 'schemes' debugfs tests tools/damon: Support more human friendly 'schemes' control Docs/admin-guide/mm/damon: Document DAMON-based Operation Schemes Documentation/admin-guide/mm/damon/guide.rst | 41 ++++- Documentation/admin-guide/mm/damon/start.rst | 11 ++ Documentation/admin-guide/mm/damon/usage.rst | 109 ++++++++++- Documentation/vm/damon/index.rst | 1 - include/linux/damon.h | 92 +++++++++- mm/damon/core.c | 125 +++++++++++++ mm/damon/dbgfs.c | 170 +++++++++++++++++- mm/damon/vaddr.c | 58 ++++++ tools/damon/_convert_damos.py | 141 +++++++++++++++ tools/damon/_damon.py | 28 ++- tools/damon/damo | 7 + tools/damon/schemes.py | 110 ++++++++++++ .../testing/selftests/damon/debugfs_attrs.sh | 29 +++ 13 files changed, 903 insertions(+), 19 deletions(-) create mode 100755 tools/damon/_convert_damos.py create mode 100644 tools/damon/schemes.py