From patchwork Fri Apr 9 16:03:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haris Iqbal X-Patchwork-Id: 12194387 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,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,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 B7FCFC433B4 for ; Fri, 9 Apr 2021 16:03:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8CECF610D1 for ; Fri, 9 Apr 2021 16:03:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231946AbhDIQDd (ORCPT ); Fri, 9 Apr 2021 12:03:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49046 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229665AbhDIQDd (ORCPT ); Fri, 9 Apr 2021 12:03:33 -0400 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE277C061760 for ; Fri, 9 Apr 2021 09:03:19 -0700 (PDT) Received: by mail-wm1-x32b.google.com with SMTP id t5-20020a1c77050000b029010e62cea9deso3270425wmi.0 for ; Fri, 09 Apr 2021 09:03:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ionos.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FSoK24GH6TdctSn2vIitJ461DxNawdXFzwAVHnRRH9c=; b=ZA9eLablzMMTfcbBLEZHJFdxhETNpsWmHm4defAFyUY2Jyjv/23KrEwvcDiKkgFEgc LOl4sP2TQm2FKk8+A2G4zwEPe7rl2kbfrACarHntI9gtDZyJBdknTA3nCfuyI6DTmhjY eXMGgyIZ+7ixCjsfpXpdzxbjmA6aPYlj/KaicB8fr3AzlGDeaAt7jOseG9rY5Syk2E2U aK7rLTJ3FtLLz3A5SL8m9N6afRSe2PAeTR04cyEr4GjPjBh1Kz6VvdYC+ytUxlnSoWc6 dM5lPrUJQJDNauXVNFXT2uMoCTt9ZOS0NKZ4twbcNRI48on2pvdSSk3TcS3vNXQEnKWo rLLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FSoK24GH6TdctSn2vIitJ461DxNawdXFzwAVHnRRH9c=; b=qrF5N2xCVyygQIKLrEH8xaMdwNkmqtwLmuGWje2xnjKEMzblHYgfwJ6IenSt8ei0xn B4z4HXtJBRX1vOzFlRWgeaDpmqsn7z3AHEoUq1HX91CuvtFvPh+7RHz9+2jlrxCGGg5d 5gWnIWEPskZp2MPrdLghUlS74428VIrCceG30J0KeKW3pC6sZgkIRhHBxPNY45PEdzBs 9+1ujrXMcbPca8fBd+49JEvRNxs1NBooKvmPMpqXHx2x2aQqdzEJ13AKvj+/j8OWIOtD 4c7xswSiGTLCtMA/E94m6ECqoQBM7c/Wjyt03/lw4VHCK+lvhpSVTv1Py6iGhxH0TnkV pn6w== X-Gm-Message-State: AOAM531FHGoDLtdtr2D/lpu7ITYDVQvJk0Q/UHuHm+IBf0abTrQ7on7I 0Ruksp6pYTs+US8r+Ypl4kd5Gw== X-Google-Smtp-Source: ABdhPJwo/9XRcqwrWhmKupgbU7CI6LR/rjSf8dHQSICQrwk6qxcl+cUiJuyPfgIOcgviDdb0SEMbqw== X-Received: by 2002:a1c:49c2:: with SMTP id w185mr14467133wma.163.1617984198658; Fri, 09 Apr 2021 09:03:18 -0700 (PDT) Received: from nb01533.speedport.ip (p200300f00f04582edcb1e40bc231ceef.dip0.t-ipconnect.de. [2003:f0:f04:582e:dcb1:e40b:c231:ceef]) by smtp.gmail.com with ESMTPSA id m3sm5322883wme.40.2021.04.09.09.03.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Apr 2021 09:03:18 -0700 (PDT) From: Md Haris Iqbal To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, jinpu.wang@ionos.com, danil.kipnis@ionos.com, Guoqing Jiang , Johannes Thumshirn , Guoqing Jiang , Md Haris Iqbal Subject: [PATCH V6 1/3] block: add io_extra_stats node Date: Fri, 9 Apr 2021 18:03:03 +0200 Message-Id: <20210409160305.711318-2-haris.iqbal@ionos.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210409160305.711318-1-haris.iqbal@ionos.com> References: <20210409160305.711318-1-haris.iqbal@ionos.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Guoqing Jiang We will track the size and latency of each io, which could make people suffer from the additional overhead if they don't need the statistics. So introduce a specific sysfs node to enable/disable the tracking. Reviewed-by: Jack Wang Reviewed-by: Johannes Thumshirn Signed-off-by: Guoqing Jiang Cc: Guoqing Jiang Signed-off-by: Md Haris Iqbal --- Documentation/ABI/testing/sysfs-block | 9 +++++++++ Documentation/block/queue-sysfs.rst | 5 +++++ block/blk-sysfs.c | 3 +++ include/linux/blkdev.h | 2 ++ 4 files changed, 19 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index e34cdeeeb9d4..3cf5a2cfaeb9 100644 --- a/Documentation/ABI/testing/sysfs-block +++ b/Documentation/ABI/testing/sysfs-block @@ -316,3 +316,12 @@ Description: does not complete in this time then the block driver timeout handler is invoked. That timeout handler can decide to retry the request, to fail it or to start a device recovery strategy. + +What: /sys/block//queue/io_extra_stats +Date: March 2021 +Contact: Guoqing Jiang +Description: + Indicates if people want to know the extra statistics (I/O + size and I/O latency) from /sys/block//io_latency + and /sys/block//io_size. The value is 0 by default, + set if the extra statistics are needed. diff --git a/Documentation/block/queue-sysfs.rst b/Documentation/block/queue-sysfs.rst index 4dc7f0d499a8..5b24c552e3f6 100644 --- a/Documentation/block/queue-sysfs.rst +++ b/Documentation/block/queue-sysfs.rst @@ -99,6 +99,11 @@ iostats (RW) This file is used to control (on/off) the iostats accounting of the disk. +io_extra_stats (RW) +------------------- +This file is used to control (on/off) the additional accounting of the +io size and io latency of disk. + logical_block_size (RO) ----------------------- This is the logical block size of the device, in bytes. diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index e03bedf180ab..848ed6449eca 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -298,6 +298,7 @@ queue_##name##_store(struct request_queue *q, const char *page, size_t count) \ QUEUE_SYSFS_BIT_FNS(nonrot, NONROT, 1); QUEUE_SYSFS_BIT_FNS(random, ADD_RANDOM, 0); QUEUE_SYSFS_BIT_FNS(iostats, IO_STAT, 0); +QUEUE_SYSFS_BIT_FNS(io_extra_stats, IO_EXTRA_STAT, 0); QUEUE_SYSFS_BIT_FNS(stable_writes, STABLE_WRITES, 0); #undef QUEUE_SYSFS_BIT_FNS @@ -629,6 +630,7 @@ static struct queue_sysfs_entry queue_hw_sector_size_entry = { QUEUE_RW_ENTRY(queue_nonrot, "rotational"); QUEUE_RW_ENTRY(queue_iostats, "iostats"); +QUEUE_RW_ENTRY(queue_io_extra_stats, "io_extra_stats"); QUEUE_RW_ENTRY(queue_random, "add_random"); QUEUE_RW_ENTRY(queue_stable_writes, "stable_writes"); @@ -664,6 +666,7 @@ static struct attribute *queue_attrs[] = { &queue_nomerges_entry.attr, &queue_rq_affinity_entry.attr, &queue_iostats_entry.attr, + &queue_io_extra_stats_entry.attr, &queue_stable_writes_entry.attr, &queue_random_entry.attr, &queue_poll_entry.attr, diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 43c4a2d04ea2..b95279494cfa 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -621,6 +621,7 @@ struct request_queue { #define QUEUE_FLAG_RQ_ALLOC_TIME 27 /* record rq->alloc_time_ns */ #define QUEUE_FLAG_HCTX_ACTIVE 28 /* at least one blk-mq hctx is active */ #define QUEUE_FLAG_NOWAIT 29 /* device supports NOWAIT */ +#define QUEUE_FLAG_IO_EXTRA_STAT 30 /* extra IO accounting for size and latency */ #define QUEUE_FLAG_MQ_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ (1 << QUEUE_FLAG_SAME_COMP) | \ @@ -641,6 +642,7 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q); #define blk_queue_stable_writes(q) \ test_bit(QUEUE_FLAG_STABLE_WRITES, &(q)->queue_flags) #define blk_queue_io_stat(q) test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags) +#define blk_queue_io_extra_stat(q) test_bit(QUEUE_FLAG_IO_EXTRA_STAT, &(q)->queue_flags) #define blk_queue_add_random(q) test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queue_flags) #define blk_queue_discard(q) test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags) #define blk_queue_zone_resetall(q) \ From patchwork Fri Apr 9 16:03:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haris Iqbal X-Patchwork-Id: 12194389 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,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,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 1A5ECC433ED for ; Fri, 9 Apr 2021 16:03:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D05C1610E5 for ; Fri, 9 Apr 2021 16:03:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233395AbhDIQDf (ORCPT ); Fri, 9 Apr 2021 12:03:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49050 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229665AbhDIQDe (ORCPT ); Fri, 9 Apr 2021 12:03:34 -0400 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 626E6C061760 for ; Fri, 9 Apr 2021 09:03:21 -0700 (PDT) Received: by mail-wm1-x32c.google.com with SMTP id 12so3184679wmf.5 for ; Fri, 09 Apr 2021 09:03:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ionos.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zpspIAi5dNx+sG9KDMF/ZwAElR3K07r3YF0OoCpocG8=; b=S5MZZtP09t2EaJUjzKMcPuAuD6wB6XirICFd5/BS7XLZ+vIcp592G2G0lXyAWvwmub xt9IkBo0nh4xhBTalimI+YdH5FMgLi3styqCnPgroDlnK4i1YPJy7LG6W2ncM5/6Gqg8 HZDoRkdIuWuHRegH4tVxmX+eXP3kRoFY9GOgfhbJXejebXiSOcC/LqmzmeNs59BlMaLI UYG/A41CD0Jq2CZ7QSTfq9pbdK2S/I8bb5TeLm2Xbax9tm05f3Jdj7etcf8DKWmifnzG fLAl5d8Bdiz4SxRLwnUwrFj1bjXsh6SaQLhZ7+O5S8psOqMBgoELNV3b9JuwZCrrVxj1 oJpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zpspIAi5dNx+sG9KDMF/ZwAElR3K07r3YF0OoCpocG8=; b=fmpP2eM2eo18RThG4teBsTU51tV2SLRaetQ3Oilr+NzsNxb7D0GVdMtm8K1ALsvGaW g5mFuAQqIe1fbcagcRV/904M7A8QO8ZhyIEozgSWnGTEpXEjoQewGc6OyhCevssnW11i XXMB2N7yR/Ch5Jdr2XxB8q413aZsaFwfeNzLormxqvkhduaRHImdFiVg9btS7jDj8qmu 6tt6wFRZXFrDPvCLijc+509DpToQDlcLoYDCyhAk9K03jW5SCDMDfsDCUsyIwfp1dT9u f2Dxc8h7d3zVxrAmfXuMLwBgJX+VeuHYXtln6P+WVe0C1LklK6Qh/VGwD2cbm5E6z91o vKBg== X-Gm-Message-State: AOAM532KBXGtyi900d1ewJC6oHmcmlSrqgDaHTCCK0LWQnGXSr6NzRHP OAJzm4HGc+0N/KPZFxnhNaQZI/ZekjnNm9JB X-Google-Smtp-Source: ABdhPJxyfXvn5nPYgQ6EWSAg4fSiOasWBUeo6oXXGmoY9VtJRCwFsoCrO1tOT8RWPeuQdYq3hnnZgA== X-Received: by 2002:a7b:c444:: with SMTP id l4mr14483217wmi.36.1617984200042; Fri, 09 Apr 2021 09:03:20 -0700 (PDT) Received: from nb01533.speedport.ip (p200300f00f04582edcb1e40bc231ceef.dip0.t-ipconnect.de. [2003:f0:f04:582e:dcb1:e40b:c231:ceef]) by smtp.gmail.com with ESMTPSA id m3sm5322883wme.40.2021.04.09.09.03.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Apr 2021 09:03:19 -0700 (PDT) From: Md Haris Iqbal To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, jinpu.wang@ionos.com, danil.kipnis@ionos.com, Guoqing Jiang , Johannes Thumshirn , Guoqing Jiang , Md Haris Iqbal Subject: [PATCH V6 2/3] block: add a statistic table for io latency Date: Fri, 9 Apr 2021 18:03:04 +0200 Message-Id: <20210409160305.711318-3-haris.iqbal@ionos.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210409160305.711318-1-haris.iqbal@ionos.com> References: <20210409160305.711318-1-haris.iqbal@ionos.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Guoqing Jiang Usually, we get the status of block device by cat stat file, but we can only know the total time with that file. And we would like to know more accurate statistic, such as each latency range, which helps people to diagnose if there is issue about the hardware. This change is based on our internal patch from Florian-Ewald Mueller (florian-ewald.mueller@ionos.com). Reviewed-by: Jack Wang Reviewed-by: Johannes Thumshirn Signed-off-by: Guoqing Jiang Cc: Guoqing Jiang Signed-off-by: Md Haris Iqbal --- Documentation/ABI/testing/sysfs-block | 8 +++++ block/blk-core.c | 24 +++++++++++++++ block/genhd.c | 42 +++++++++++++++++++++++++++ include/linux/part_stat.h | 5 ++++ 4 files changed, 79 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index 3cf5a2cfaeb9..90970a8dc70f 100644 --- a/Documentation/ABI/testing/sysfs-block +++ b/Documentation/ABI/testing/sysfs-block @@ -27,6 +27,14 @@ Description: For more details refer Documentation/admin-guide/iostats.rst +What: /sys/block//io_latency +Date: March 2021 +Contact: Guoqing Jiang +Description: + The /sys/block//io_latency files displays the I/O + latency of disk . With it, it is convenient to know + the statistics of I/O latency for each type (read, write, + discard and flush) which have happened to the disk. What: /sys/block///stat Date: February 2008 diff --git a/block/blk-core.c b/block/blk-core.c index 9bcdae93f6d4..0895d5eddc1f 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1263,6 +1263,26 @@ static void update_io_ticks(struct block_device *part, unsigned long now, } } +static void blk_additional_latency(struct block_device *part, const int sgrp, + struct request_queue *q, + unsigned long duration) +{ + unsigned int idx; + + if (!blk_queue_io_extra_stat(q)) + return; + + duration /= NSEC_PER_MSEC; + duration /= HZ_TO_MSEC_NUM; + if (likely(duration > 0)) { + idx = ilog2(duration); + if (idx > ADD_STAT_NUM - 1) + idx = ADD_STAT_NUM - 1; + } else + idx = 0; + part_stat_inc(part, latency_table[idx][sgrp]); +} + static void blk_account_io_completion(struct request *req, unsigned int bytes) { if (req->part && blk_do_io_stat(req)) { @@ -1287,6 +1307,8 @@ void blk_account_io_done(struct request *req, u64 now) part_stat_lock(); update_io_ticks(req->part, jiffies, true); + blk_additional_latency(req->part, sgrp, req->q, + now - req->start_time_ns); part_stat_inc(req->part, ios[sgrp]); part_stat_add(req->part, nsecs[sgrp], now - req->start_time_ns); part_stat_unlock(); @@ -1353,6 +1375,8 @@ static void __part_end_io_acct(struct block_device *part, unsigned int op, part_stat_lock(); update_io_ticks(part, now, true); + blk_additional_latency(part, sgrp, part->bd_disk->queue, + jiffies_to_nsecs(duration)); part_stat_add(part, nsecs[sgrp], jiffies_to_nsecs(duration)); part_stat_local_dec(part, in_flight[op_is_write(op)]); part_stat_unlock(); diff --git a/block/genhd.c b/block/genhd.c index 39ca97b0edc6..66c6342968a3 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1067,6 +1067,47 @@ static struct device_attribute dev_attr_fail_timeout = __ATTR(io-timeout-fail, 0644, part_timeout_show, part_timeout_store); #endif +static ssize_t io_latency_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct block_device *bdev = dev_to_bdev(dev); + size_t count = 0; + int i, sgrp; + + for (i = 0; i < ADD_STAT_NUM; i++) { + unsigned int from, to; + + if (i == ADD_STAT_NUM - 1) { + count += scnprintf(buf + count, PAGE_SIZE - count, + " >= %5d ms: ", + (2 << (i - 2)) * HZ_TO_MSEC_NUM); + } else { + if (i < 2) { + from = i; + to = i + 1; + } else { + from = 2 << (i - 2); + to = 2 << (i - 1); + } + count += scnprintf(buf + count, PAGE_SIZE - count, + "[%5d - %-5d) ms: ", + from * HZ_TO_MSEC_NUM, + to * HZ_TO_MSEC_NUM); + } + + for (sgrp = 0; sgrp < NR_STAT_GROUPS; sgrp++) + count += scnprintf(buf + count, PAGE_SIZE - count, + "%lu ", part_stat_read(bdev, + latency_table[i][sgrp])); + count += scnprintf(buf + count, PAGE_SIZE - count, "\n"); + } + + return count; +} + +static struct device_attribute dev_attr_io_latency = + __ATTR(io_latency, 0444, io_latency_show, NULL); + static struct attribute *disk_attrs[] = { &dev_attr_range.attr, &dev_attr_ext_range.attr, @@ -1086,6 +1127,7 @@ static struct attribute *disk_attrs[] = { #ifdef CONFIG_FAIL_IO_TIMEOUT &dev_attr_fail_timeout.attr, #endif + &dev_attr_io_latency.attr, NULL }; diff --git a/include/linux/part_stat.h b/include/linux/part_stat.h index d2558121d48c..e2bde5160de4 100644 --- a/include/linux/part_stat.h +++ b/include/linux/part_stat.h @@ -9,6 +9,11 @@ struct disk_stats { unsigned long sectors[NR_STAT_GROUPS]; unsigned long ios[NR_STAT_GROUPS]; unsigned long merges[NR_STAT_GROUPS]; + /* + * We measure latency (ms) for 1, 2, ..., 1024 and >=1024. + */ +#define ADD_STAT_NUM 12 + unsigned long latency_table[ADD_STAT_NUM][NR_STAT_GROUPS]; unsigned long io_ticks; local_t in_flight[2]; }; From patchwork Fri Apr 9 16:03:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haris Iqbal X-Patchwork-Id: 12194391 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,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,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 A09BAC433B4 for ; Fri, 9 Apr 2021 16:03:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7D98D610A3 for ; Fri, 9 Apr 2021 16:03:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233527AbhDIQDg (ORCPT ); Fri, 9 Apr 2021 12:03:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49058 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233674AbhDIQDg (ORCPT ); Fri, 9 Apr 2021 12:03:36 -0400 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D2998C061761 for ; Fri, 9 Apr 2021 09:03:22 -0700 (PDT) Received: by mail-wm1-x32d.google.com with SMTP id y20-20020a1c4b140000b029011f294095d3so5014190wma.3 for ; Fri, 09 Apr 2021 09:03:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ionos.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2jLSjPNFxEIEpN2oTjxkYPNUB7wV95qNs1fZYQN8D2U=; b=U1YS5JHmwBkJSQbe6JgqjNNkdHu9X2h868YaRJBIUMHPoPh7bPdJmSFnYiIzeik8Rg NfCSmPm7knBM/A36tTsX/eDu28KcNB+N/PNGmjD8kgmnt+0vKkW80+wezXVXOalE/n5Z kKWsGzW2tQ+CvSyY4VEZ0rHV9Qi5dPfzjBpt7LVd/Yqngj0LOT6WjQKqEJ/Xue1Omo/H /dVPAR/28/TumrqfLL5mut4b80O6dIH/I5s9aqSPhy4gJJqmO/qSq/mcUjGamSYUBaM7 RiNswYn+Lcdl6OEQshrBDIDDWADGrrsqVEXNBIGDfGF2xZo6vaX80/7wO21wFyivt2hk CeWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2jLSjPNFxEIEpN2oTjxkYPNUB7wV95qNs1fZYQN8D2U=; b=KUPJ05Cn7jTfWjOVMcSiLo3pKsE5HjTm01E36oBva9wgJal1r+5sdIsU4eEdAjALFU kcavE2mG2fI+Q2nDsi5TrEAoEPLux/bmOPGm7kOckDnNUrJXYD1cZVflcrpesMrLAlkx R/MgjaixCtYYcRcQzRzLAqANXgHvPItGxznML8Hz2cvtUjAaQfeYlpgXM5qlZi9zh2C5 1qHrqJWLg6LBFdiv+uPgbwMpbv1lcDcabsQ+Yy2/RwkiZpr9ZWm/9B1LTlt0QeVhZ5yo Jpj9k0DbovuTBrIdt7CQ+zPZAnHOckgYM8Wm9J/+5sSFruIPBTd9S5QvFo9W/LqYqjqR +MjA== X-Gm-Message-State: AOAM533tkWTeeBvK9WB8RbkSUkaZoNC7cyM2qvUYW6Iifw1DzhkXE0Q/ 53HmomAd/ZCoKFdopDNJUh45Gw== X-Google-Smtp-Source: ABdhPJwUenIcEr0HNJx66HKMh1hizVex8v6UerM8R4sDuiKGzZoeexv7gRtBcpqrFXfyyvnFhVI52Q== X-Received: by 2002:a05:600c:3556:: with SMTP id i22mr14568395wmq.116.1617984201565; Fri, 09 Apr 2021 09:03:21 -0700 (PDT) Received: from nb01533.speedport.ip (p200300f00f04582edcb1e40bc231ceef.dip0.t-ipconnect.de. [2003:f0:f04:582e:dcb1:e40b:c231:ceef]) by smtp.gmail.com with ESMTPSA id m3sm5322883wme.40.2021.04.09.09.03.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Apr 2021 09:03:21 -0700 (PDT) From: Md Haris Iqbal To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, jinpu.wang@ionos.com, danil.kipnis@ionos.com, Guoqing Jiang , Johannes Thumshirn , Guoqing Jiang , Md Haris Iqbal Subject: [PATCH V6 3/3] block: add a statistic table for io sector Date: Fri, 9 Apr 2021 18:03:05 +0200 Message-Id: <20210409160305.711318-4-haris.iqbal@ionos.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210409160305.711318-1-haris.iqbal@ionos.com> References: <20210409160305.711318-1-haris.iqbal@ionos.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Guoqing Jiang With the sector table, so we can know the distribution of different IO size from upper layer, which means we could have the opportunity to tune the performance based on the mostly issued IOs. This change is based on our internal patch from Florian-Ewald Mueller (florian-ewald.mueller@ionos.com). Reviewed-by: Jack Wang Reviewed-by: Johannes Thumshirn Signed-off-by: Guoqing Jiang Cc: Guoqing Jiang Signed-off-by: Md Haris Iqbal --- Documentation/ABI/testing/sysfs-block | 9 +++++++ block/blk-core.c | 20 ++++++++++++++ block/genhd.c | 39 +++++++++++++++++++++++++++ include/linux/part_stat.h | 3 ++- 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index 90970a8dc70f..a32b2c399e81 100644 --- a/Documentation/ABI/testing/sysfs-block +++ b/Documentation/ABI/testing/sysfs-block @@ -36,6 +36,15 @@ Description: the statistics of I/O latency for each type (read, write, discard and flush) which have happened to the disk. +What: /sys/block//io_size +Date: March 2021 +Contact: Guoqing Jiang +Description: + The /sys/block//io_size files displays the I/O + size of disk . With it, it is convenient to know + the statistics of I/O size for each type (read, write, + discard and flush) which have happened to the disk. + What: /sys/block///stat Date: February 2008 Contact: Jerome Marchand diff --git a/block/blk-core.c b/block/blk-core.c index 0895d5eddc1f..deaf82f7a478 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1283,12 +1283,31 @@ static void blk_additional_latency(struct block_device *part, const int sgrp, part_stat_inc(part, latency_table[idx][sgrp]); } +static void blk_additional_sector(struct block_device *part, const int sgrp, + struct request_queue *q, unsigned int sectors) +{ + unsigned int idx; + + if (!blk_queue_io_extra_stat(q)) + return; + + if (sectors == 1) + idx = 0; + else + idx = ilog2(sectors); + + idx = (idx > (ADD_STAT_NUM - 1)) ? (ADD_STAT_NUM - 1) : idx; + part_stat_inc(part, size_table[idx][sgrp]); +} + static void blk_account_io_completion(struct request *req, unsigned int bytes) { if (req->part && blk_do_io_stat(req)) { const int sgrp = op_stat_group(req_op(req)); part_stat_lock(); + blk_additional_sector(req->part, sgrp, req->q, + bytes >> SECTOR_SHIFT); part_stat_add(req->part, sectors[sgrp], bytes >> 9); part_stat_unlock(); } @@ -1341,6 +1360,7 @@ static unsigned long __part_start_io_acct(struct block_device *part, update_io_ticks(part, now, false); part_stat_inc(part, ios[sgrp]); part_stat_add(part, sectors[sgrp], sectors); + blk_additional_sector(part, sgrp, part->bd_disk->queue, sectors); part_stat_local_inc(part, in_flight[op_is_write(op)]); part_stat_unlock(); diff --git a/block/genhd.c b/block/genhd.c index 66c6342968a3..cce3c1234282 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1108,6 +1108,44 @@ static ssize_t io_latency_show(struct device *dev, static struct device_attribute dev_attr_io_latency = __ATTR(io_latency, 0444, io_latency_show, NULL); +static ssize_t io_size_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct block_device *bdev = dev_to_bdev(dev); + size_t count = 0; + int i, sgrp; + + for (i = 0; i < ADD_STAT_NUM; i++) { + unsigned int from, to; + + if (i == ADD_STAT_NUM - 1) { + from = 2 << (i - 2); + count += scnprintf(buf + count, PAGE_SIZE - count, + " >=%5d KB: ", from); + } else { + if (i < 2) { + from = i; + to = i + 1; + } else { + from = 2 << (i - 2); + to = 2 << (i - 1); + } + count += scnprintf(buf + count, PAGE_SIZE - count, + "[%5d - %-5d) KB: ", from, to); + } + for (sgrp = 0; sgrp < NR_STAT_GROUPS; sgrp++) + count += scnprintf(buf + count, PAGE_SIZE - count, + "%lu ", part_stat_read(bdev, + size_table[i][sgrp])); + count += scnprintf(buf + count, PAGE_SIZE - count, "\n"); + } + + return count; +} + +static struct device_attribute dev_attr_io_size = + __ATTR(io_size, 0444, io_size_show, NULL); + static struct attribute *disk_attrs[] = { &dev_attr_range.attr, &dev_attr_ext_range.attr, @@ -1128,6 +1166,7 @@ static struct attribute *disk_attrs[] = { &dev_attr_fail_timeout.attr, #endif &dev_attr_io_latency.attr, + &dev_attr_io_size.attr, NULL }; diff --git a/include/linux/part_stat.h b/include/linux/part_stat.h index e2bde5160de4..221fb3a884b2 100644 --- a/include/linux/part_stat.h +++ b/include/linux/part_stat.h @@ -10,10 +10,11 @@ struct disk_stats { unsigned long ios[NR_STAT_GROUPS]; unsigned long merges[NR_STAT_GROUPS]; /* - * We measure latency (ms) for 1, 2, ..., 1024 and >=1024. + * We measure latency (ms) and size (KB) for 1, 2, ..., 1024 and >=1024. */ #define ADD_STAT_NUM 12 unsigned long latency_table[ADD_STAT_NUM][NR_STAT_GROUPS]; + unsigned long size_table[ADD_STAT_NUM][NR_STAT_GROUPS]; unsigned long io_ticks; local_t in_flight[2]; };