From patchwork Wed Jan 27 14:59:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guoqing Jiang X-Patchwork-Id: 12050297 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.7 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 29375C433E0 for ; Wed, 27 Jan 2021 15:05:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DE43D207FC for ; Wed, 27 Jan 2021 15:05:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235347AbhA0PFW (ORCPT ); Wed, 27 Jan 2021 10:05:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235361AbhA0PBn (ORCPT ); Wed, 27 Jan 2021 10:01:43 -0500 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9D5D5C0617A7 for ; Wed, 27 Jan 2021 06:59:45 -0800 (PST) Received: by mail-ej1-x62c.google.com with SMTP id bl23so3078970ejb.5 for ; Wed, 27 Jan 2021 06:59:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloud.ionos.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0ySpizCGBHZcRBItw9WwXPpD1Uaiz2HbJL0Kyu+cvr0=; b=VF7L3ao7JgxJicRBkk+vQHnkh5DVfT8K0tAo1XRwAn6Thi7pD1Vhr41jROPqEsmL2M 3niY2xKMDd4SAUqzA93zJNpjpB5tUwByy1vr2rw9LY2lOM++8WL9yiFjwKkmerF7Fhio Rg4lCF2tD6H/iITFNDd/Y4sGE4gMpfj216u4gVuI5cbpE15vA/2jsYRxv5fAY8p7VBv2 uWNRBO15yk3swsuSkNsVZ8b8NKF0YNoKdxkuk6TJuSrLG9bPGXeJHS453peZvEBtrrFB ZC+HkmOz0NsdevNrraMv0C3lHANFh4Rg/KeugPx8P9G8Y56cZoW6QgVn/urDpEsg7y+4 ixvw== 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; bh=0ySpizCGBHZcRBItw9WwXPpD1Uaiz2HbJL0Kyu+cvr0=; b=R9kOxiudM89b1kLh+CA5LV1CA5u4EdmiIxEbqrX6H9/I9bEIaU8KaDregaVmYjbgkW OGFTv/LXawX62+Fj9REY4nwFPAZKsHCvwZoEnzKlsa8HEYSgOS2JLt9as/nX81hLL7SR HmMUjTOvcjdbrvslKWcODy6zdBgJzaaFmhonyCgwvDkongMUpujwxEBam8m4NWGX7QLU 5Pk1+j/qx3db/YJXtYaiHWPCWvtc0EL61VqrCQhy1c3Ecwf7sP9sMbpS8KCSLYhDY2D+ SoNWT+6bVULfr6szWN+qGF8JYvEot1SQmHr+2Rad+5sSBWc7YdI+V/fa0dn87VOzxE6/ M5jA== X-Gm-Message-State: AOAM532/Uhyz50uT5rNM6dl1qJpeHVQhN42jFGz32ReoZVlsSWKTMpcp FeTUOtoSI91TfwB0Szz+cIkkGQ== X-Google-Smtp-Source: ABdhPJx+9mcQtAWge4HsMSsjdGMtGTVFAcVj6aMRLqSBrvsD1c5+9Wz3fFGRP9vGpV47BrzjrUNApA== X-Received: by 2002:a17:906:ce5b:: with SMTP id se27mr6964228ejb.57.1611759584369; Wed, 27 Jan 2021 06:59:44 -0800 (PST) Received: from ls00508.pb.local ([2001:1438:4010:2540:9172:bd00:1e95:fbc9]) by smtp.gmail.com with ESMTPSA id j4sm1477140edt.18.2021.01.27.06.59.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 06:59:43 -0800 (PST) From: Guoqing Jiang To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, danil.kipnis@cloud.ionos.com, jinpu.wang@cloud.ionos.com, Guoqing Jiang Subject: [PATCH 1/4] block: add a statistic table for io latency Date: Wed, 27 Jan 2021 15:59:27 +0100 Message-Id: <20210127145930.8826-2-guoqing.jiang@cloud.ionos.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> References: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org 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. Also a new config option is introduced to control if people want to know the additional statistics or not, and we use the option for io sector in next patch. This change is based on our internal patch from Florian-Ewald Mueller (florian-ewald.mueller@cloud.ionos.com). Reviewed-by: Jack Wang Signed-off-by: Guoqing Jiang --- Documentation/ABI/testing/sysfs-block | 8 ++++++ block/Kconfig | 8 ++++++ block/blk-core.c | 29 +++++++++++++++++++ block/genhd.c | 41 +++++++++++++++++++++++++++ include/linux/part_stat.h | 7 +++++ 5 files changed, 93 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index e34cdeeeb9d4..4371a0f2cb5e 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: January 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/Kconfig b/block/Kconfig index a2297edfdde8..ca3854a7e3db 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -174,6 +174,14 @@ config BLK_DEBUG_FS Unless you are building a kernel for a tiny system, you should say Y here. +config BLK_ADDITIONAL_DISKSTAT + bool "Block layer additional diskstat" + default n + help + Enabling this option adds io latency statistics for each block device. + + If unsure, say N. + config BLK_DEBUG_FS_ZONED bool default BLK_DEBUG_FS && BLK_DEV_ZONED diff --git a/block/blk-core.c b/block/blk-core.c index 5e752840b41a..27cd153e374b 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1264,6 +1264,33 @@ static void update_io_ticks(struct block_device *part, unsigned long now, } } +/* + * Either account additional stat for request if req is not NULL or account for bio. + */ +static void blk_additional_latency(struct block_device *part, const int sgrp, + struct request *req, unsigned long start_jiffies) +{ +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT + unsigned int idx; + unsigned long duration, now = READ_ONCE(jiffies); + + if (req) + duration = jiffies_to_nsecs(now) - req->start_time_ns; + else + duration = jiffies_to_nsecs(now - start_jiffies); + + 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]); +#endif +} + static void blk_account_io_completion(struct request *req, unsigned int bytes) { if (req->part && blk_do_io_stat(req)) { @@ -1288,6 +1315,7 @@ 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, 0); part_stat_inc(req->part, ios[sgrp]); part_stat_add(req->part, nsecs[sgrp], now - req->start_time_ns); part_stat_unlock(); @@ -1354,6 +1382,7 @@ 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, NULL, start_time); 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 d3ef29fbc536..cdbf56f05060 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1146,6 +1146,44 @@ static struct device_attribute dev_attr_fail_timeout = __ATTR(io-timeout-fail, 0644, part_timeout_show, part_timeout_store); #endif +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT +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); +#endif + static struct attribute *disk_attrs[] = { &dev_attr_range.attr, &dev_attr_ext_range.attr, @@ -1164,6 +1202,9 @@ static struct attribute *disk_attrs[] = { #endif #ifdef CONFIG_FAIL_IO_TIMEOUT &dev_attr_fail_timeout.attr, +#endif +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT + &dev_attr_io_latency.attr, #endif NULL }; diff --git a/include/linux/part_stat.h b/include/linux/part_stat.h index d2558121d48c..763953238227 100644 --- a/include/linux/part_stat.h +++ b/include/linux/part_stat.h @@ -9,6 +9,13 @@ struct disk_stats { unsigned long sectors[NR_STAT_GROUPS]; unsigned long ios[NR_STAT_GROUPS]; unsigned long merges[NR_STAT_GROUPS]; +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT + /* + * 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]; +#endif unsigned long io_ticks; local_t in_flight[2]; }; From patchwork Wed Jan 27 14:59:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guoqing Jiang X-Patchwork-Id: 12050299 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.7 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 76897C433DB for ; Wed, 27 Jan 2021 15:05:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 369E3207E2 for ; Wed, 27 Jan 2021 15:05:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235361AbhA0PFY (ORCPT ); Wed, 27 Jan 2021 10:05:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50614 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235280AbhA0PBp (ORCPT ); Wed, 27 Jan 2021 10:01:45 -0500 Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9232EC0617A9 for ; Wed, 27 Jan 2021 06:59:48 -0800 (PST) Received: by mail-ej1-x630.google.com with SMTP id rv9so3024693ejb.13 for ; Wed, 27 Jan 2021 06:59:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloud.ionos.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xZXXdM0nwviPv62C0/D2tg3TfLgw8aPPC00NN5WeuA0=; b=fm3IXoQ2OYKZ9VhqlCBbd0J83xXVTv7UrzYQkf2tl48qECnUNWJltfehSwIK2gcYun 83xOcrWp0n+dOSZXHA+u+rBtoyK6bW4NlwMtKyoU0Dv5pWb353EOWFr1tR/WysRD9nBD wC1Cbu+FrMxvtAb6lrpgln1CfKKypj/vpP3RK+OPti2yTK7Sntf20ek5zpkC59r7JWCr r6mO066+yiDvyMT5uXDgVfrRm9NX2Q9zvOogPBZyrAvMVuAongIWjUVYg4cAFdbQ7BzD bLAlKfmR/Fhx/zjatPjzEe4QOCUV8ouLKrcZK3m1YEMJJjoudjLWy3OT8YWXfSlUXZK+ 1RkA== 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; bh=xZXXdM0nwviPv62C0/D2tg3TfLgw8aPPC00NN5WeuA0=; b=pqXlnmB90+9rUWRHzCUQfkZbPsZZz4sJEFrDnwFeUnIlh9wSp+cgeCKHf4mIKKgg30 5v3rKtPvXHOZxEr7HU2xYkHtqK1cKuXJobBK3MZgKauPbTlhBwnVg35IM7O2unfSxzve Qcv1MdRD1/NYQY3e6BKW0U1aYeEghS8CDzf8biBJ6mh4b+UY13kcIw44g79ZktRVaIAQ W+JoHnj2Fmdv5znBAW2ZMZL427Adwib3PL9qzTcCAEHnA7cxjz2BEVBmHaLtf23RtW1u 1fBh3cPs+hNtGjOe3gnacA4tglQuUks00s5hWwKqX5moMlIHWDi6U2bB+NeuTishJwLr pBjA== X-Gm-Message-State: AOAM5305nAzUVTNgjtdE/yawvNskgpPSNjK0yykpgVUDondyMyMW/1Bv HCcEgn6FzKDYwtadecvJtcfkAmrh3t9V3kx3 X-Google-Smtp-Source: ABdhPJx3SblMKmXno16NMPVtDPyYgNBOHAosuuQy0m5MZry6K65bVQmDJvDxZUmEqYYaBvuSYtJiRg== X-Received: by 2002:a17:907:1b27:: with SMTP id mp39mr7085599ejc.519.1611759587289; Wed, 27 Jan 2021 06:59:47 -0800 (PST) Received: from ls00508.pb.local ([2001:1438:4010:2540:9172:bd00:1e95:fbc9]) by smtp.gmail.com with ESMTPSA id j4sm1477140edt.18.2021.01.27.06.59.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 06:59:44 -0800 (PST) From: Guoqing Jiang To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, danil.kipnis@cloud.ionos.com, jinpu.wang@cloud.ionos.com, Guoqing Jiang Subject: [PATCH 2/4] block: add a statistic table for io sector Date: Wed, 27 Jan 2021 15:59:28 +0100 Message-Id: <20210127145930.8826-3-guoqing.jiang@cloud.ionos.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> References: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org 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@cloud.ionos.com). Reviewed-by: Jack Wang Signed-off-by: Guoqing Jiang --- Documentation/ABI/testing/sysfs-block | 9 +++++++ block/Kconfig | 3 ++- block/blk-core.c | 18 +++++++++++++ block/genhd.c | 37 +++++++++++++++++++++++++++ include/linux/part_stat.h | 3 ++- 5 files changed, 68 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index 4371a0f2cb5e..0ffb63469772 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: January 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/Kconfig b/block/Kconfig index ca3854a7e3db..ad04ec253b09 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -178,7 +178,8 @@ config BLK_ADDITIONAL_DISKSTAT bool "Block layer additional diskstat" default n help - Enabling this option adds io latency statistics for each block device. + Enabling this option adds io latency and io size statistics for each + block device. If unsure, say N. diff --git a/block/blk-core.c b/block/blk-core.c index 27cd153e374b..4271c5a8e685 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1291,12 +1291,29 @@ static void blk_additional_latency(struct block_device *part, const int sgrp, #endif } +static void blk_additional_sector(struct block_device *part, const int sgrp, + unsigned int sectors) +{ +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT + unsigned int idx; + + 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]); +#endif +} + 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, bytes >> SECTOR_SHIFT); part_stat_add(req->part, sectors[sgrp], bytes >> 9); part_stat_unlock(); } @@ -1348,6 +1365,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, 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 cdbf56f05060..5c12cf7f90a0 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1182,6 +1182,42 @@ static ssize_t io_latency_show(struct device *dev, struct device_attribute *attr 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); #endif static struct attribute *disk_attrs[] = { @@ -1205,6 +1241,7 @@ static struct attribute *disk_attrs[] = { #endif #ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT &dev_attr_io_latency.attr, + &dev_attr_io_size.attr, #endif NULL }; diff --git a/include/linux/part_stat.h b/include/linux/part_stat.h index 763953238227..8a6440ec9134 100644 --- a/include/linux/part_stat.h +++ b/include/linux/part_stat.h @@ -11,10 +11,11 @@ struct disk_stats { unsigned long merges[NR_STAT_GROUPS]; #ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT /* - * 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]; #endif unsigned long io_ticks; local_t in_flight[2]; From patchwork Wed Jan 27 14:59:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guoqing Jiang X-Patchwork-Id: 12050419 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.7 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 C46D2C433E9 for ; Wed, 27 Jan 2021 15:33:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 80771207B3 for ; Wed, 27 Jan 2021 15:33:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235367AbhA0PF3 (ORCPT ); Wed, 27 Jan 2021 10:05:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232072AbhA0PBy (ORCPT ); Wed, 27 Jan 2021 10:01:54 -0500 Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2EA6C0617AA for ; Wed, 27 Jan 2021 06:59:51 -0800 (PST) Received: by mail-ej1-x633.google.com with SMTP id gx5so3068484ejb.7 for ; Wed, 27 Jan 2021 06:59:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloud.ionos.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=V+W+fPaccyHn1uXbBCoY+DAN6C3QZSzOPnBrXdEQLXA=; b=Gp9IN3z/wBEUsW2g4glH7zxnEY67YpBP5RJ9e70/zy9rOeTlCvGijNFvpnhU27uuDe Wi9qNhpY/6I8zEojpsotpXjHLEeLKjxdZAGmatG5hF5kfW+KLPwFVivarhSlx77iOEh6 IviMR0de5IhH4bhcLx6wD5UT3PEUpbGwGR/4BP7/EXZqIH+o0+ulxnfN2J/WVUzEniDy ODeKS36FwHHeANcd1/9UgXFWMEGppMD1CGlgTEdC6lMX549RUaMSYfzaHX/GfHGJxGeP KWgGdgg/mZx8ISbeYrFJ1sfwxb/M84B0rGNdBhqj9AT5bxWYMIfbWGm9f/+nJ1G2dd4Z IAhQ== 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; bh=V+W+fPaccyHn1uXbBCoY+DAN6C3QZSzOPnBrXdEQLXA=; b=YYvgI668RpYbonbKltWMRmLsxrrJI3pln1Cw+3dU9Btid3YU9j+cZZPAtiIZXbzs1+ fGkt/i3qE+mSd23Dk/3jqkNX4M/pldKp4VAqVLQop8PXHOaKfwHQU6U8q5kwEXLvkIDQ U0c4ZGEhY88befmZr7mfQoqE6C7wKX7jvqUn5/FTP6Xcuwn3sqXp/FlO4Quh/s98eqNK DcKg9+GGANF5UE0cQdyX2To5kb2C+nyvNO2w7OKGQ0E60pp/9SiZJmP68EEfSEiqg1o7 stVezrvU+HDp5Y3Ofb9cmhj0NeIP699vx0ENYfVsO8C5VDPZt5yKQ3baMA1+JWntKG7t l1Pw== X-Gm-Message-State: AOAM530gNPIh6W4kxfXhFS1qrM+CTkNFI5UenUwyxCr6psRzCflqTcyp kAd38V5HbbEFSHZFCBfQ0LFVoQ== X-Google-Smtp-Source: ABdhPJweruQ4a91+DnWTvScjHLED5X/D8dSzhSRBRuu3IMu3gn232ifJIFFja4xHLJU+WBYoKTys2w== X-Received: by 2002:a17:906:4c90:: with SMTP id q16mr7440802eju.49.1611759590404; Wed, 27 Jan 2021 06:59:50 -0800 (PST) Received: from ls00508.pb.local ([2001:1438:4010:2540:9172:bd00:1e95:fbc9]) by smtp.gmail.com with ESMTPSA id j4sm1477140edt.18.2021.01.27.06.59.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 06:59:48 -0800 (PST) From: Guoqing Jiang To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, danil.kipnis@cloud.ionos.com, jinpu.wang@cloud.ionos.com, Guoqing Jiang Subject: [PATCH 3/4] block: add io_extra_stats node Date: Wed, 27 Jan 2021 15:59:29 +0100 Message-Id: <20210127145930.8826-4-guoqing.jiang@cloud.ionos.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> References: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Even we have introduced a Kconfig option (default N) to control the accounting of additional data, but the option still could be enabled occasionally while user doesn't care about the size and latency of io, and they could suffer from the additional overhead. So introduce a specific sysfs node to avoid such mistake. Reviewed-by: Jack Wang Signed-off-by: Guoqing Jiang --- Documentation/ABI/testing/sysfs-block | 9 +++++++++ Documentation/block/queue-sysfs.rst | 6 ++++++ block/blk-sysfs.c | 10 ++++++++++ include/linux/blkdev.h | 6 ++++++ 4 files changed, 31 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index 0ffb63469772..e1611c62a3e1 100644 --- a/Documentation/ABI/testing/sysfs-block +++ b/Documentation/ABI/testing/sysfs-block @@ -333,3 +333,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: January 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 2638d3446b79..14c4a4c7b9a9 100644 --- a/Documentation/block/queue-sysfs.rst +++ b/Documentation/block/queue-sysfs.rst @@ -99,6 +99,12 @@ 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, and BLK_ADDITIONAL_DISKSTAT should be +enabled if you want the additional accounting. + 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 b513f1683af0..87f174f32e9a 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -288,6 +288,9 @@ 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(stable_writes, STABLE_WRITES, 0); +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT +QUEUE_SYSFS_BIT_FNS(io_extra_stats, IO_EXTRA_STAT, 0); +#endif #undef QUEUE_SYSFS_BIT_FNS static ssize_t queue_zoned_show(struct request_queue *q, char *page) @@ -616,6 +619,10 @@ QUEUE_RW_ENTRY(queue_iostats, "iostats"); QUEUE_RW_ENTRY(queue_random, "add_random"); QUEUE_RW_ENTRY(queue_stable_writes, "stable_writes"); +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT +QUEUE_RW_ENTRY(queue_io_extra_stats, "io_extra_stats"); +#endif + static struct attribute *queue_attrs[] = { &queue_requests_entry.attr, &queue_ra_entry.attr, @@ -658,6 +665,9 @@ static struct attribute *queue_attrs[] = { &queue_io_timeout_entry.attr, #ifdef CONFIG_BLK_DEV_THROTTLING_LOW &blk_throtl_sample_time_entry.attr, +#endif +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT + &queue_io_extra_stats_entry.attr, #endif NULL, }; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 20f3706b6b2e..6cebc689c36a 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) | \ @@ -658,6 +659,11 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q); #else #define blk_queue_rq_alloc_time(q) false #endif +#ifdef CONFIG_BLK_ADDITIONAL_DISKSTAT +#define blk_queue_io_extra_stat(q) test_bit(QUEUE_FLAG_IO_EXTRA_STAT, &(q)->queue_flags) +#else +#define blk_queue_io_extra_stat(q) false +#endif #define blk_noretry_request(rq) \ ((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \ From patchwork Wed Jan 27 14:59:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guoqing Jiang X-Patchwork-Id: 12050515 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.7 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 0E971C433E0 for ; Wed, 27 Jan 2021 16:10:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C90E820786 for ; Wed, 27 Jan 2021 16:10:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235350AbhA0QJA (ORCPT ); Wed, 27 Jan 2021 11:09:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50750 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235407AbhA0PCf (ORCPT ); Wed, 27 Jan 2021 10:02:35 -0500 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 49D70C061351 for ; Wed, 27 Jan 2021 07:00:00 -0800 (PST) Received: by mail-ed1-x52e.google.com with SMTP id b21so2802587edy.6 for ; Wed, 27 Jan 2021 07:00:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloud.ionos.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ooV+zYcH2UW7H93/HJsVkbGNha3ok5dAmhicUP0PDyw=; b=SERtrejDbIU66Dqc8InTYP1YkIPUZaIgkL144/shNCLfnHrupy2oqUIOtE/Zhm5USG 94O1TJuZ4i0bbKwdQFnwmQyl2mg42DEyI04IcC13mMzo9T0VH4XOqMZomlD53z0hX/Ba WRZIq/a9nF1xSS41HfAzQdA8xDtg5c/ZfhxJ8YvOsJ9JtqTHABHhYriNlTxfTYv+GGpz +vdEPR3GQSd/NBT0s2oaUePKpfgiGSYGQFxa8YhoC99YGGK+eAaoCItzBgAfgCZO9FAL 6bB9KrqxmzMRpQ9qbBg16O0YYhyLVnbjSu6eIepSQjgpSG0fElXjCW9V/e6wChGbwlXO 7pEw== 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; bh=ooV+zYcH2UW7H93/HJsVkbGNha3ok5dAmhicUP0PDyw=; b=pzGtSH94H/nn1Kn68VRtxxKk0Okm9qFyI7Yktz69jtQzAXr9A9rm/CkCX159BYW77o X3bnqWC7PCE/hB5hYBrsVDaTuWYK2Pa7URi8LGqhWcNm5SLLFyKNDMISR6pibLuaT/jq V2cXe7LOJr/ctPm6PJFGQbyzlHAKoPDFIIQq/TsEz0CalqhELUgWipBLI3MQ7jzTbu+w Bv5pLqKh3zh4OO/F1LxR6uGzr83E/blc3IuWY3uEvk3//B/+o6M43KI3BadMQoBmYzxN DNG2AlKSBJSPGAX5WfIyE7D0+OfZWguC/H7rRCG7IFcxhV8dBHmvlyXx2Ki1BgpXxro1 yqcg== X-Gm-Message-State: AOAM533gZ8DpNtGap/E8qJLcoK2teJShQexdts4JaX6zNnHaRW4rzyIJ 1r2X/8rQmUgjciAjeC0AbDvRlA== X-Google-Smtp-Source: ABdhPJyPQolfLbnD6xkrUssjvLjsj2SQfhEUMNQlOwRYJm5sVBj9DzLq8ASgyCQKWZh63WGHnGBILA== X-Received: by 2002:a05:6402:13c8:: with SMTP id a8mr9211317edx.191.1611759599112; Wed, 27 Jan 2021 06:59:59 -0800 (PST) Received: from ls00508.pb.local ([2001:1438:4010:2540:9172:bd00:1e95:fbc9]) by smtp.gmail.com with ESMTPSA id j4sm1477140edt.18.2021.01.27.06.59.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 06:59:55 -0800 (PST) From: Guoqing Jiang To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, danil.kipnis@cloud.ionos.com, jinpu.wang@cloud.ionos.com, Guoqing Jiang Subject: [PATCH 4/4] block: call blk_additional_{latency,sector} only when io_extra_stats is true Date: Wed, 27 Jan 2021 15:59:30 +0100 Message-Id: <20210127145930.8826-5-guoqing.jiang@cloud.ionos.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> References: <20210127145930.8826-1-guoqing.jiang@cloud.ionos.com> Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org If ADDITIONAL_DISKSTAT is enabled carelessly, then it is bad to people who don't want the additional overhead. Now add check before call blk_additional_{latency,sector}, which guarntee only those who really know about the attribute can account the additional data. Reviewed-by: Jack Wang Signed-off-by: Guoqing Jiang --- block/blk-core.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 4271c5a8e685..f62cfc8f801e 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1313,7 +1313,8 @@ static void blk_account_io_completion(struct request *req, unsigned int bytes) const int sgrp = op_stat_group(req_op(req)); part_stat_lock(); - blk_additional_sector(req->part, sgrp, bytes >> SECTOR_SHIFT); + if (blk_queue_io_extra_stat(req->q)) + blk_additional_sector(req->part, sgrp, bytes >> SECTOR_SHIFT); part_stat_add(req->part, sectors[sgrp], bytes >> 9); part_stat_unlock(); } @@ -1332,7 +1333,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, 0); + if (blk_queue_io_extra_stat(req->q)) + blk_additional_latency(req->part, sgrp, req, 0); part_stat_inc(req->part, ios[sgrp]); part_stat_add(req->part, nsecs[sgrp], now - req->start_time_ns); part_stat_unlock(); @@ -1365,7 +1367,8 @@ 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, sectors); + if (blk_queue_io_extra_stat(part->bd_disk->queue)) + blk_additional_sector(part, sgrp, sectors); part_stat_local_inc(part, in_flight[op_is_write(op)]); part_stat_unlock(); @@ -1400,7 +1403,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, NULL, start_time); + if (blk_queue_io_extra_stat(part->bd_disk->queue)) + blk_additional_latency(part, sgrp, NULL, start_time); part_stat_add(part, nsecs[sgrp], jiffies_to_nsecs(duration)); part_stat_local_dec(part, in_flight[op_is_write(op)]); part_stat_unlock();