From patchwork Thu Aug 13 08:11:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guoqing Jiang X-Patchwork-Id: 11711973 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6AC0013B6 for ; Thu, 13 Aug 2020 08:12:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4BFBE2078D for ; Thu, 13 Aug 2020 08:12:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=gmx.net header.i=@gmx.net header.b="OGO4zZY5" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726100AbgHMIMs (ORCPT ); Thu, 13 Aug 2020 04:12:48 -0400 Received: from mout.gmx.net ([212.227.15.19]:53201 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726044AbgHMIMs (ORCPT ); Thu, 13 Aug 2020 04:12:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1597306365; bh=+ZfYF5wH6iV2bU1406LUOwiOnEnxlYXlEbgh7Ubh++g=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=OGO4zZY56VV6n/5ZrRAPIOMDziskVEfqjeByNqvpJ8Bnxp8v0B+B12aKPV0gKHz1J 0mqDOOuzCf3csytq5f9AmXg4PwsKGGawRcwI/2ydZEdWo6Xu1ky3wMOJ8lsX2d9SOX RJqSPfBbXyEtdJt9v8cY+j8jenWPM1Q8W2BKo71E= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from ls00508.pb.local ([62.217.45.26]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MmlXA-1kVo7P2pvS-00jof9; Thu, 13 Aug 2020 10:12:45 +0200 From: Guoqing Jiang To: linux-block@vger.kernel.org, axboe@kernel.dk Cc: jinpu.wang@cloud.ionos.com, danil.kipnis@cloud.ionos.com, Guoqing Jiang Subject: [PATCH RFC V3 2/4] block: add a statistic table for io sector Date: Thu, 13 Aug 2020 10:11:25 +0200 Message-Id: <20200813081127.4914-3-guoqing.jiang@gmx.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200813081127.4914-1-guoqing.jiang@gmx.com> References: <20200813081127.4914-1-guoqing.jiang@gmx.com> X-Provags-ID: V03:K1:v/sJJruaf2OodJU3df2w6Inx5ZxTlEa4F8GwBncT0qJeZom6YFA 95t6v/fUklzJWwBqtMqYFtrHBC1G2qAhwoUfU5c0vjF8poqoeAj1wgEww9ZxsJzwC50u6Yl jEMTt9/XNirMI7tmu9YC0e5K/0q1H7aTk1xOYMDd3yzb4GOIGdX7xJ4q4CqFyAmm0qFXhej /zWFoKLie9XXvlie3TrYQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:G+JMFj2N+Dc=:n2Xu7z6QgDJCwY+iYTgmMJ 0wHcnr+5bwK/t7tsBsDSw03jP8k+9Nayj0EmLCDgCdTFMCFC7rZVzr8wJTuR1EGHM37jjvjar Rr7D7RSYotSBydIV2zLuXyp0onLTSM//p+sho7qZ13wNQGfUhLttiOWLkJWNSUs5d8LAEobo1 VW4sy93ew1oaaZecfTkH9KbOeBjibXdBFNqUbSsPpkpGW80g+8dGBorEg6YSKbpAiK1A6VHDP HfZeYSKKM6XBhQ8yMfrroO5ADQEFhTh3Umev/jADI6gn7HWpVk4VNfPrXYcXQ6aBObS+koy3M psNcLFAN27FtLNtFGGQ0rTiBZQ/ZMTV+1BW1HTaehy4u10LM1GgazUP/+qAeND3Lh/TQoREvf c799WZ5Y8cXbpfbWaHmxPPCCYvIoe/aQ5/H3Ku9OuOUUZfUg4peplNxpLF38dVoNpmlUshWGc ms/toExOiSWT3uRpi2Wi6YHCaKIcVyNlenKaLB8Gu6WOyYQJem2T34lgfHFDMcbseQoEjLaT8 7y5ihCvYeGMmrqClPGjFjzm7p46P2fq65njeqPb1fnh5RmQCDPATHN/ohANjXui1EP5tHvsA2 103R7+wnoAxHRqF4A+kk0yqzdz1R+UvS2Cw78DEgfXFSiwOJgn07WDQjVBFfLQewwoBioZfLI RhAMi8jtuNFMqkK20MsLVW0TmktGUsub3Cp458w420hFcYPFZp0oJSZ2mGXsmjin71TDbmiTp 7JMLzBMutsBtIl1muHCh8aYgjHYfv14mNSCUygHU6qDuL9F7W04TN519iVT5IFVQtVdZkW+GT ohY2GZZWbOxrsC8RqgxnwexpeDobjSA5ipRT5TJXeZu0gzSTK9z/uwJjqBcsm79GITPk7RncK ZkEQris62L7XXG1P79BnWy2LfFPApqAha2g5hehFsKpz57j2fAQ4BDJnCoRX74NYTH8eEZB3b 7Qm/LpKAZ9z/mampiWH6daMnNOkbwyvNG7q8vKJw/YyT359EKPK5Nch5cxSEsUrkRGaWae5st zbigjBfzWmp84akIghuD7CFPmJeHV4bZ+3/gbEG6NKKG2Llh/CON4MbMxXX9uLZ4Yk2eFCkCE 3doXhFW5YOyucDd0Zk1JiKFgjolsxgldz9Vu1ZCPVhivOuhHhVMu55mGPMay6fWankunjXG3P KZU4Hncg2s4ddDMvO2tXcqDqnY3f8UBJLgbnXV0y7lubNqOYIZh87NDVJLUJpgMFHjTpHJStL PqcZYKTY9/v/BOI849H/GC98j+bMID9neWcc4yQ9/DYjgBIW6zfyATU43uccQwI7YDhuBXy6+ GhYkPQiYIMdUwYjiP7wUnzEe0BQz2Tq+hFyrWIb2ZzekLAX1IogTr23KHZBOB1lEAQKLXiVk5 9C81y04FeJ5niFKBolnSAcQ/sY7OGCG+ZTK3xBFKyu5AxvMaN4jrYhkg/DGJCNjuPZOOyBPZI 9Yl8G8wYeVDoWT4TRolqYEeKCjnQGSjdlu3y+EpL3e/0od3DpzueQnnUpXrWX0E3x5A3cjceH XMZqqUhA+32q+vkbT5YjE9kLmww3XZnjy/Y3wACovq8on Sender: linux-block-owner@vger.kernel.org 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@cloud.ionos.com). 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(-) -- 2.17.1 diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index 1bae82238a79..d00d940e4e1b 100644 --- a/Documentation/ABI/testing/sysfs-block +++ b/Documentation/ABI/testing/sysfs-block @@ -32,6 +32,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: August 2020 +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 360f63111e2d..c9b9f99152d8 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -180,7 +180,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 fa339e0cc38a..1a8e508516c9 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1438,6 +1438,22 @@ static void blk_additional_latency(struct hd_struct *part, const int sgrp, #endif } +static void blk_additional_sector(struct hd_struct *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)) { @@ -1446,6 +1462,7 @@ static void blk_account_io_completion(struct request *req, unsigned int bytes) part_stat_lock(); part = req->part; + blk_additional_sector(part, sgrp, bytes >> SECTOR_SHIFT); part_stat_add(part, sectors[sgrp], bytes >> 9); part_stat_unlock(); } @@ -1499,6 +1516,7 @@ unsigned long disk_start_io_acct(struct gendisk *disk, unsigned int sectors, 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 21a3dae6a024..38517b86a968 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1454,6 +1454,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 hd_struct *p = dev_to_part(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(p, 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[] = { @@ -1477,6 +1513,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 fe3def8c69d7..f23c367ea646 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];