From bc26917c263c7b66e7f569128c5f88ead8bd5bd4 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Wed, 20 Sep 2023 22:32:12 +0000 Subject: [PATCH 01/26] Initial commit of ssdmon HLD --- .../images/SSDMOND_SequenceDiagram.png | Bin 0 -> 71747 bytes doc/ssdmond/ssdmond-hld.md | 129 ++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 doc/ssdmond/images/SSDMOND_SequenceDiagram.png create mode 100644 doc/ssdmond/ssdmond-hld.md diff --git a/doc/ssdmond/images/SSDMOND_SequenceDiagram.png b/doc/ssdmond/images/SSDMOND_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c553d64254c2cc810dbfc0e57a44b52b8eafe248 GIT binary patch literal 71747 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 Ct0mx_t;ju7-Vh~(}PzTdupUyOB{C@Q85;4Y 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

4d;V{Cqkz&e9DZ@Yq%0r{9Fc9g1zW&=XRWO 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 Y?{5C(M)~I-(Ve_K*RL%4&Bpis0y=*9=l}o! literal 0 HcmV?d00001 diff --git a/doc/ssdmond/ssdmond-hld.md b/doc/ssdmond/ssdmond-hld.md new file mode 100644 index 00000000000..0ea907e7f5d --- /dev/null +++ b/doc/ssdmond/ssdmond-hld.md @@ -0,0 +1,129 @@ +# SONiC SSD Daemon Design # +### Rev 0.1 ### + + | Rev | Date | Author | Change Description | + |:---:|:-----------:|:------------------:|-----------------------------------| + | 0.1 | | Ashwin Srinivasan | Initial version | + +## 1. Overview + +This document is intended to provide a high-level design for a Solid-State Drive monitoring daemon. + +Solid-State Drives (SSDs) are storage devices that use NAND-flash technology to store data. They offer the end user significant benefits compared to HDDs, some of which include reliability, reduced size, increased energy efficiency and improved IO speeds which translates to faster boot times, quicker computational capabilities and an improved system responsiveness overall. Like all devices, however, they experience performance degradation over time on account of a variety of factors such as overall disk writes, bad-blocks management, lack of free space, sub-optimal operational temperature and good-old wear-and-tear which speaks to the overall health of the SSD. + +The goal of the SSD Monitoring Daemon (ssdmond) is to provide meaningful metrics for the aforementioned issues and enable streaming telemetry for these attributes so that the required preventative measures are triggered in the eventuality of performance degradation. + +## 2. Data Collection + +We are intrested in the following characteristics that describe various aspects of the SSD: + +### **2.1 Priority 0 Attributes** + +**The following are dynamic fields, offering up-to-date information that describes the current state of the SSD** + + - IO Reads + - IO Writes + - Reserved Blocks Count + - Temperature + +**IO Reads/Writes** - SSDs use wear-leveling algorithms to distribute write and erase cycles evenly across the NAND cells to extend their lifespan. However, write amplification can occur when data is written, rewritten, and erased in a way that creates additional write operations, which can slow down performance. + +**Reserved Blocks Count** - Reserving some number of filesystem blocks for use by privileged processes is done to avoid filesystem fragmentation, and to allow system daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem. Normally, the default percentage of reserved blocks is 5%.[1](#1-man-tune2fs) + +**Temperature** - Extreme temperatures can affect SSD performance. Excessive heat can lead to throttling to prevent damage, while extreme cold can slow down data access. + + +### **2.2 Priority 1 Attributes** + +**These are a combination of static (S) and dynamic (D) fields, offering secondary information that provides additional context about the SSD** + + - Vendor Model (S) + - Serial Number (S) + - Firmware (S) + - Health (D) + +These fields are self-explanatory. + + +### **2.3 `ssdmond` Daemon Flow** + +0. Vendor would be responsible for configuring the following values: + - **loop timeout** - This determines how often the dynamic information would be updated. Default is 6 hours. + - **SSD vendor-specific search terms** - This would ensure that all the attributes are properly parsed from the device. + +1. `ssdmond` would be started by the `pmon` docker container +2. The daemon would gather the static info once init-ed, by leveraging the `ssdutil` utility and update the StateDB +3. It would periodically parse the priority 0 attributes either by leveraging `ssdutil` or directly through Linux utilities and update the StateDB. + +This is detailed in the sequence diagram below: + +![image.png](images/SSDMOND_SequenceDiagram.png) + + +NOTE: While it is previously established that we use the abstraction provided by the `ssdutil` class to offer vendors the opportunity to implement their own SSD parsing logic, the [primary intent](#1-overview) of this iteration of the design is to enable streaming telemetry of these attributes, i.e., update the StateDB with the parsed data. A design choice is therefore made to bypass the abstraction logic in favor of this goal in the interim, with the expressed understanding that said abstraction will follow in a [future version](#future-work) of this daemon. + + +### **2.4 Data Collection Logic** + +The SONiC OS already contains logic to parse information about SSDs from several vendors by way of the `ssdutil` platform utility. We leverage this utility to gather the following information: + +- Priority 0: Temperature +- Priority 1: All aforementioned attributes + +This section will therefore only go into detail about data collection of attributes mentioned in [section 2.1](#21-priority-0-attributes): + +#### **2.4.1 IO Reads/Writes** + +- grep `/proc/diskstats` for statistics about the SSD of interest +- Read the 4th value for reads completed successfully and the 8th value for writes completed[2](#2-kernelorg-procdiskstats) + +#### **2.4.2 Reserved Blocks Count** + +- Examine the SMART data for attributes related to reserved blocks or over-provisioning. +- The exact attribute name and number can vary depending on the SSD manufacturer and model. +- Look for keywords like "Reserved Block Count," "Over Provisioning," or similar terms. + + Here's an example of what the SMART data output might look like: + + ``` + ... + ID# ATTRIBUTE_NAME FLAGS VALUE WORST THRESH FAIL RAW_VALUE + ... + 173 Wear_Leveling_Count 0x0032 100 100 000 Old_age Always - 123 + 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 456 + ... + + ``` + + In this example, the "Wear_Leveling_Count" attribute might be indicative of reserved blocks or over-provisioning. However, the specific attribute and its interpretation can vary, so we make the search term and ID configurable by our vendors while maintaining a default search term in the event that this value is left unconfigured. + +## **StateDB Schema** +``` +; Defines information for the SSD in a device + +key = SSD_INFO ; This key is for information that does not change for the lifetime of the SSD + +; field = value + +Temperature = STRING ; Describes the operating temperature of the SSD (Priority 0, Dynamic) +io_reads = INT ; Describes the total number of reads completed successfully from the SSD (Priority 0, Dynamic) +io_writes = INT ; Describes the total number of writes completed on the SSD (Priority 0, Dynamic) +reserve_blocks = INT ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) +device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) +serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) +firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) +health = STRING ; Describes the overall health of the SSD (Priority 1, Dynamic) +``` + +## Future Work + +1. Code abstraction and CLI support for aforementioned newly introduced fields +2. Support for eMMC storage + +## References + +### 1. [man tune2fs](https://linux.die.net/man/8/tune2f) +### 2. [kernel.org /proc/diskstats](https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats) + +


+[Back to top](#1-overview) \ No newline at end of file From a9db382103bcee1af0caf89a203edecf0d1e212c Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Wed, 11 Oct 2023 08:52:24 +0000 Subject: [PATCH 02/26] Changes to HLD based on prgeor and staphylo review comments --- doc/ssdmond/ssdmond-hld.md | 119 ++++++++++++++++++++++++++----------- 1 file changed, 83 insertions(+), 36 deletions(-) diff --git a/doc/ssdmond/ssdmond-hld.md b/doc/ssdmond/ssdmond-hld.md index 0ea907e7f5d..98b0fcbcaaa 100644 --- a/doc/ssdmond/ssdmond-hld.md +++ b/doc/ssdmond/ssdmond-hld.md @@ -28,7 +28,12 @@ We are intrested in the following characteristics that describe various aspects **IO Reads/Writes** - SSDs use wear-leveling algorithms to distribute write and erase cycles evenly across the NAND cells to extend their lifespan. However, write amplification can occur when data is written, rewritten, and erased in a way that creates additional write operations, which can slow down performance. -**Reserved Blocks Count** - Reserving some number of filesystem blocks for use by privileged processes is done to avoid filesystem fragmentation, and to allow system daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem. Normally, the default percentage of reserved blocks is 5%.[1](#1-man-tune2fs) +**Reserved Blocks Count** - Reserved blocks in a Solid State Drive (SSD) serve several critical purposes to enhance the drive's performance, reliability, and longevity. These reserved blocks are managed by the drive's firmware, and their specific allocation and management may vary between SSD manufacturers. The primary purposes of reserved blocks in an SSD are: + +- **Bad-block replacement:** When the firmware detects a bad block, it can map it to a reserved block and continue using the drive without data loss. +- **Wear Leveling:** Reserved blocks are used to replace or relocate data from cells that have been heavily used, ensuring that all cells are used evenly. +- **Over-Provisioning:** Over-provisioning helps maintain consistent performance and extends the lifespan of the SSD by providing additional resources for wear leveling and bad block management. +- **Garbage collection:** When files are deleted or modified, the old data needs to be erased and marked as available for new data. Reserved blocks can help facilitate this process by providing a temporary location to move valid data from blocks that need to be erased. **Temperature** - Extreme temperatures can affect SSD performance. Excessive heat can lead to throttling to prevent damage, while extreme cold can slow down data access. @@ -47,22 +52,16 @@ These fields are self-explanatory. ### **2.3 `ssdmond` Daemon Flow** -0. Vendor would be responsible for configuring the following values: - - **loop timeout** - This determines how often the dynamic information would be updated. Default is 6 hours. - - **SSD vendor-specific search terms** - This would ensure that all the attributes are properly parsed from the device. +0. SONiC partners would be responsible for configuring the **loop timeout** - This determines how often the dynamic information would be updated. Default is 6 hours. 1. `ssdmond` would be started by the `pmon` docker container -2. The daemon would gather the static info once init-ed, by leveraging the `ssdutil` utility and update the StateDB -3. It would periodically parse the priority 0 attributes either by leveraging `ssdutil` or directly through Linux utilities and update the StateDB. +2. The daemon would gather the static info once init-ed, by leveraging the `SsdBase` class and update the StateDB +3. It would periodically parse the priority 0 attributes by leveraging `SsdBase` class and update the StateDB. This is detailed in the sequence diagram below: ![image.png](images/SSDMOND_SequenceDiagram.png) - -NOTE: While it is previously established that we use the abstraction provided by the `ssdutil` class to offer vendors the opportunity to implement their own SSD parsing logic, the [primary intent](#1-overview) of this iteration of the design is to enable streaming telemetry of these attributes, i.e., update the StateDB with the parsed data. A design choice is therefore made to bypass the abstraction logic in favor of this goal in the interim, with the expressed understanding that said abstraction will follow in a [future version](#future-work) of this daemon. - - ### **2.4 Data Collection Logic** The SONiC OS already contains logic to parse information about SSDs from several vendors by way of the `ssdutil` platform utility. We leverage this utility to gather the following information: @@ -70,55 +69,103 @@ The SONiC OS already contains logic to parse information about SSDs from several - Priority 0: Temperature - Priority 1: All aforementioned attributes -This section will therefore only go into detail about data collection of attributes mentioned in [section 2.1](#21-priority-0-attributes): +This section will therefore only go into detail about data collection of attributes mentioned in [section 2.1](#21-priority-0-attributes). + +#### **2.4.1 SsdBase API additions** + +In order to collect IO reads/writes and number of reserved blocks, we would need to add the following member methods to the `SsdBase` class in [ssd_base.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_base.py): + + +``` +class SsdBase(object): + +... + +def get_io_reads(self): +""" +Retrieves the total number of Input/Output (I/O) reads done on an SSD + +Returns: + An integer value of the total number of I/O reads +""" -#### **2.4.1 IO Reads/Writes** +def get_io_writes(self): +""" +Retrieves the total number of Input/Output (I/O) writes done on an SSD -- grep `/proc/diskstats` for statistics about the SSD of interest -- Read the 4th value for reads completed successfully and the 8th value for writes completed[2](#2-kernelorg-procdiskstats) +Returns: + An integer value of the total number of I/O writes +""" -#### **2.4.2 Reserved Blocks Count** +def get_reserves_blocks(self): +""" +Retrieves the total number of reserved blocks in an SSD -- Examine the SMART data for attributes related to reserved blocks or over-provisioning. -- The exact attribute name and number can vary depending on the SSD manufacturer and model. -- Look for keywords like "Reserved Block Count," "Over Provisioning," or similar terms. +Returns: + An integer value of the total number of reserved blocks +""" + +``` - Here's an example of what the SMART data output might look like: +#### **2.4.2 Support for Multiple SSDs** - ``` - ... - ID# ATTRIBUTE_NAME FLAGS VALUE WORST THRESH FAIL RAW_VALUE - ... - 173 Wear_Leveling_Count 0x0032 100 100 000 Old_age Always - 123 - 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 456 - ... +The `ssdutil` utility assumes that the SSD drive is `/dev/sda` whereas the drive letter could be any label based on the nuber of SSDs. We leverage the `lsblk` command to get list of all the SSDs in the device. For instance, if there were three disks labeled 'sda', 'sdb', and 'sdc' on a device, the output of the `lsblk -d -o name,type` command would typically look something like this: - ``` +NAME TYPE +sda disk +sdb disk +sdc disk - In this example, the "Wear_Leveling_Count" attribute might be indicative of reserved blocks or over-provisioning. However, the specific attribute and its interpretation can vary, so we make the search term and ID configurable by our vendors while maintaining a default search term in the event that this value is left unconfigured. +This output lists the names of the disks (sda, sdb, and sdc) and their types (which are "disk" in this case, indicating that they are block storage devices). This output format makes it easy to identify the disks on any system. We then leverage the following proposed StateDB schema to store and stream information about each of these disks. -## **StateDB Schema** +## **3. StateDB Schema** ``` -; Defines information for the SSD in a device +; Defines information for each SSD in a device -key = SSD_INFO ; This key is for information that does not change for the lifetime of the SSD +key = SSD_INFO| ; This key is for information that does not change for the lifetime of the SSD - SSD_INFO|SDX -; field = value +; field = value -Temperature = STRING ; Describes the operating temperature of the SSD (Priority 0, Dynamic) +temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) io_reads = INT ; Describes the total number of reads completed successfully from the SSD (Priority 0, Dynamic) io_writes = INT ; Describes the total number of writes completed on the SSD (Priority 0, Dynamic) reserve_blocks = INT ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) -health = STRING ; Describes the overall health of the SSD (Priority 1, Dynamic) +health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Priority 1, Dynamic) +``` + +Example: For an SSD with name 'SDA', the STATE_DB entry would be: + +``` +127.0.0.1:6379[6]> KEYS SSD_INFO|* +1) "SSD_INFO|SDB" +2) "SSD_INFO|SDA" +127.0.0.1:6379[6]> HGETALL SSD_INFO|SDA + 1) "temperature" + 2) "30C" + 3) "io_reads" + 4) "49527" + 5) "io_writes" + 6) "238309" + 7) "reserve_blocks" + 8) "0" + 9) "device_model" +10) "InnoDisk Corp. - mSATA 3IE3" +11) "health" +12) "92" +13) "serial" +14) "BCA11712190600251" +15) "firmware" +16) "S16425cG" +127.0.0.1:6379[6]> ``` ## Future Work -1. Code abstraction and CLI support for aforementioned newly introduced fields -2. Support for eMMC storage +1. Support for eMMC storage +2. Support for more SSD vendors ## References From 7de95b277623974d2e44063de43fe5fc172da219 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Thu, 12 Oct 2023 02:26:55 +0000 Subject: [PATCH 03/26] Clarified sdutil class name. Changed case of SSD_INFO keys. --- doc/ssdmond/ssdmond-hld.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/ssdmond/ssdmond-hld.md b/doc/ssdmond/ssdmond-hld.md index 98b0fcbcaaa..f7aeea11298 100644 --- a/doc/ssdmond/ssdmond-hld.md +++ b/doc/ssdmond/ssdmond-hld.md @@ -55,8 +55,8 @@ These fields are self-explanatory. 0. SONiC partners would be responsible for configuring the **loop timeout** - This determines how often the dynamic information would be updated. Default is 6 hours. 1. `ssdmond` would be started by the `pmon` docker container -2. The daemon would gather the static info once init-ed, by leveraging the `SsdBase` class and update the StateDB -3. It would periodically parse the priority 0 attributes by leveraging `SsdBase` class and update the StateDB. +2. The daemon would gather the static info once init-ed, by leveraging the `SsdUtil` class and update the StateDB +3. It would periodically parse the priority 0 attributes by leveraging `SsdUtil` class and update the StateDB. This is detailed in the sequence diagram below: @@ -64,7 +64,7 @@ This is detailed in the sequence diagram below: ### **2.4 Data Collection Logic** -The SONiC OS already contains logic to parse information about SSDs from several vendors by way of the `ssdutil` platform utility. We leverage this utility to gather the following information: +The SONiC OS already contains logic to parse information about SSDs from several vendors by way of the `SsdUtil` class. We leverage this to gather the following information: - Priority 0: Temperature - Priority 1: All aforementioned attributes @@ -73,7 +73,7 @@ This section will therefore only go into detail about data collection of attribu #### **2.4.1 SsdBase API additions** -In order to collect IO reads/writes and number of reserved blocks, we would need to add the following member methods to the `SsdBase` class in [ssd_base.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_base.py): +In order to collect IO reads/writes and number of reserved blocks, we would need to add the following member methods to the `SsdBase` class in [ssd_base.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_base.py) and provide a generic implementation in [ssd_generic.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_generic.py): ``` From 97e91670ff372edc1611fe67f143a398efb63524 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Thu, 12 Oct 2023 18:31:58 +0000 Subject: [PATCH 04/26] Made minor revisions --- doc/ssdmond/ssdmond-hld.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/ssdmond/ssdmond-hld.md b/doc/ssdmond/ssdmond-hld.md index f7aeea11298..4996792f82b 100644 --- a/doc/ssdmond/ssdmond-hld.md +++ b/doc/ssdmond/ssdmond-hld.md @@ -129,19 +129,19 @@ key = SSD_INFO| ; This key is for inform temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) io_reads = INT ; Describes the total number of reads completed successfully from the SSD (Priority 0, Dynamic) io_writes = INT ; Describes the total number of writes completed on the SSD (Priority 0, Dynamic) -reserve_blocks = INT ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) +reserved_blocks = INT ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Priority 1, Dynamic) ``` -Example: For an SSD with name 'SDA', the STATE_DB entry would be: +Example: For an SSD with name 'sda', the STATE_DB entry would be: ``` 127.0.0.1:6379[6]> KEYS SSD_INFO|* -1) "SSD_INFO|SDB" -2) "SSD_INFO|SDA" +1) "SSD_INFO|sdb" +2) "SSD_INFO|sda" 127.0.0.1:6379[6]> HGETALL SSD_INFO|SDA 1) "temperature" 2) "30C" @@ -149,7 +149,7 @@ Example: For an SSD with name 'SDA', the STATE_DB entry would be: 4) "49527" 5) "io_writes" 6) "238309" - 7) "reserve_blocks" + 7) "reserved_blocks" 8) "0" 9) "device_model" 10) "InnoDisk Corp. - mSATA 3IE3" From d0395ee609782b1f4fa805ebad81b50864f7120a Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 20 Oct 2023 19:18:07 +0000 Subject: [PATCH 05/26] Modified daemon per staphylo and prgeor comments. Renamed daemon to 'stormond' --- ...agram.png => stormond_SequenceDiagram.png} | Bin .../{ssdmond-hld.md => stormond-hld.md} | 89 ++++++++++++------ 2 files changed, 62 insertions(+), 27 deletions(-) rename doc/ssdmond/images/{SSDMOND_SequenceDiagram.png => stormond_SequenceDiagram.png} (100%) rename doc/ssdmond/{ssdmond-hld.md => stormond-hld.md} (69%) diff --git a/doc/ssdmond/images/SSDMOND_SequenceDiagram.png b/doc/ssdmond/images/stormond_SequenceDiagram.png similarity index 100% rename from doc/ssdmond/images/SSDMOND_SequenceDiagram.png rename to doc/ssdmond/images/stormond_SequenceDiagram.png diff --git a/doc/ssdmond/ssdmond-hld.md b/doc/ssdmond/stormond-hld.md similarity index 69% rename from doc/ssdmond/ssdmond-hld.md rename to doc/ssdmond/stormond-hld.md index 4996792f82b..2c63dd87745 100644 --- a/doc/ssdmond/ssdmond-hld.md +++ b/doc/ssdmond/stormond-hld.md @@ -1,4 +1,4 @@ -# SONiC SSD Daemon Design # +# SONiC Storage Monitoring Daemon Design # ### Rev 0.1 ### | Rev | Date | Author | Change Description | @@ -7,11 +7,11 @@ ## 1. Overview -This document is intended to provide a high-level design for a Solid-State Drive monitoring daemon. +This document is intended to provide a high-level design for a Storage monitoring daemon. Solid-State Drives (SSDs) are storage devices that use NAND-flash technology to store data. They offer the end user significant benefits compared to HDDs, some of which include reliability, reduced size, increased energy efficiency and improved IO speeds which translates to faster boot times, quicker computational capabilities and an improved system responsiveness overall. Like all devices, however, they experience performance degradation over time on account of a variety of factors such as overall disk writes, bad-blocks management, lack of free space, sub-optimal operational temperature and good-old wear-and-tear which speaks to the overall health of the SSD. -The goal of the SSD Monitoring Daemon (ssdmond) is to provide meaningful metrics for the aforementioned issues and enable streaming telemetry for these attributes so that the required preventative measures are triggered in the eventuality of performance degradation. +The goal of the Storage Monitoring Daemon (stormond) is to provide meaningful metrics for the aforementioned issues and enable streaming telemetry for these attributes so that the required preventative measures are triggered in the eventuality of performance degradation. ## 2. Data Collection @@ -50,17 +50,17 @@ We are intrested in the following characteristics that describe various aspects These fields are self-explanatory. -### **2.3 `ssdmond` Daemon Flow** +### **2.3 `stormond` Daemon Flow** 0. SONiC partners would be responsible for configuring the **loop timeout** - This determines how often the dynamic information would be updated. Default is 6 hours. -1. `ssdmond` would be started by the `pmon` docker container +1. `stormond` would be started by the `pmon` docker container 2. The daemon would gather the static info once init-ed, by leveraging the `SsdUtil` class and update the StateDB 3. It would periodically parse the priority 0 attributes by leveraging `SsdUtil` class and update the StateDB. This is detailed in the sequence diagram below: -![image.png](images/SSDMOND_SequenceDiagram.png) +![image.png](images/stormond_SequenceDiagram.png) ### **2.4 Data Collection Logic** @@ -107,29 +107,69 @@ Returns: ``` -#### **2.4.2 Support for Multiple SSDs** +#### **2.4.2 Support for Multiple Storage Disks** -The `ssdutil` utility assumes that the SSD drive is `/dev/sda` whereas the drive letter could be any label based on the nuber of SSDs. We leverage the `lsblk` command to get list of all the SSDs in the device. For instance, if there were three disks labeled 'sda', 'sdb', and 'sdc' on a device, the output of the `lsblk -d -o name,type` command would typically look something like this: +The `ssdutil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. It could also be a different type of storage device such as eMMC, eUSB or NVMe. -NAME TYPE -sda disk -sdb disk -sdc disk +In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()` This new class provides the following methods: -This output lists the names of the disks (sda, sdb, and sdc) and their types (which are "disk" in this case, indicating that they are block storage devices). This output format makes it easy to identify the disks on any system. We then leverage the following proposed StateDB schema to store and stream information about each of these disks. +``` +class StorageDevices(): + +# A dictionary where the key is the name of the disk and the value is the corresponding class object +devices = {} + +... + +def get_storage_devices(self): +""" +Retrieves all the storage disks on the device and adds their names as key to the 'devices' dict. + + +def get_storage_device_object(self): +""" +Instantiates an object of the corresponding storage device class. Appends the instantiated class object to the corresponding dictionary object key. + +NOTE: SsdUtil is supported currently. Future support for EmmcUtil, eUSBUtil and NVMeUtil + +""" + +``` + +This class is a helper to the Storage Daemon class. + +Example usage: + +Assuming a device contains the following storage disks: + +root@str-a7280cr3-2:~# ls /sys/block/ +loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 **mmcblk0** mmcblk0boot0 mmcblk0boot1 **sda** + + +We would instantiate an object of the StorageDevices() class +storage = StorageDevices() + +storage.devices would contain {"mmcblk0": , "sda": } + +we would then get static and dynamic information by leveraging the respective member function implementations of `SsdUtil` and `EmmcUtil`, as they both derive from `SsdBase`. + +Note that eUSBUtil and NVMeUtil classes are not yet available. + + +We then leverage the following proposed StateDB schema to store and stream information about each of these disks. ## **3. StateDB Schema** ``` -; Defines information for each SSD in a device +; Defines information for each Storage Disk in a device -key = SSD_INFO| ; This key is for information that does not change for the lifetime of the SSD - SSD_INFO|SDX +key = STORAGE_INFO| ; This key is for information that does not change for the lifetime of the SSD - SSD_INFO|SDX ; field = value temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) io_reads = INT ; Describes the total number of reads completed successfully from the SSD (Priority 0, Dynamic) io_writes = INT ; Describes the total number of writes completed on the SSD (Priority 0, Dynamic) -reserved_blocks = INT ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) +reserved_blocks = INT ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) @@ -139,10 +179,10 @@ health = STRING ; Describes the overall Example: For an SSD with name 'sda', the STATE_DB entry would be: ``` -127.0.0.1:6379[6]> KEYS SSD_INFO|* -1) "SSD_INFO|sdb" -2) "SSD_INFO|sda" -127.0.0.1:6379[6]> HGETALL SSD_INFO|SDA +127.0.0.1:6379[6]> KEYS STORAGE_INFO|* +1) "STORAGE_INFO|sdb" +2) "STORAGE_INFO|sda" +127.0.0.1:6379[6]> HGETALL STORAGE_INFO|sda 1) "temperature" 2) "30C" 3) "io_reads" @@ -164,13 +204,8 @@ Example: For an SSD with name 'sda', the STATE_DB entry would be: ## Future Work -1. Support for eMMC storage -2. Support for more SSD vendors - -## References - -### 1. [man tune2fs](https://linux.die.net/man/8/tune2f) -### 2. [kernel.org /proc/diskstats](https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats) +1. Support for eMMC, eUSB and NVMe storage disks +2. Refactor `ssdutil` [in sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/ssdutil) to cover all storage types, including changing the name of the utility to 'storageutil'


[Back to top](#1-overview) \ No newline at end of file From 01dc8d8fe26f6e2379e353cc876d75c5141e71a7 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 20 Oct 2023 22:13:28 +0000 Subject: [PATCH 06/26] Minor revisions based on prgeor review comments --- doc/ssdmond/stormond-hld.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/ssdmond/stormond-hld.md b/doc/ssdmond/stormond-hld.md index 2c63dd87745..cad90fe27d9 100644 --- a/doc/ssdmond/stormond-hld.md +++ b/doc/ssdmond/stormond-hld.md @@ -52,11 +52,9 @@ These fields are self-explanatory. ### **2.3 `stormond` Daemon Flow** -0. SONiC partners would be responsible for configuring the **loop timeout** - This determines how often the dynamic information would be updated. Default is 6 hours. - 1. `stormond` would be started by the `pmon` docker container 2. The daemon would gather the static info once init-ed, by leveraging the `SsdUtil` class and update the StateDB -3. It would periodically parse the priority 0 attributes by leveraging `SsdUtil` class and update the StateDB. +3. It would parse the priority 0 attributes by leveraging `SsdUtil` class and update the StateDB every hour. This is detailed in the sequence diagram below: @@ -111,7 +109,7 @@ Returns: The `ssdutil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. It could also be a different type of storage device such as eMMC, eUSB or NVMe. -In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()` This new class provides the following methods: +In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()` which will accompany the stormond daemon at `sonic-platform-daemons/sonic-stormond/scripts/StorageDevices.py`. This new class provides the following methods: ``` class StorageDevices(): @@ -124,11 +122,12 @@ devices = {} def get_storage_devices(self): """ Retrieves all the storage disks on the device and adds their names as key to the 'devices' dict. - +""" def get_storage_device_object(self): """ -Instantiates an object of the corresponding storage device class. Appends the instantiated class object to the corresponding dictionary object key. +Instantiates an object of the corresponding storage device class. +Adds the instantiated class object as a value to the corresponding key in the dictionary object. NOTE: SsdUtil is supported currently. Future support for EmmcUtil, eUSBUtil and NVMeUtil @@ -141,19 +140,19 @@ This class is a helper to the Storage Daemon class. Example usage: Assuming a device contains the following storage disks: - +``` root@str-a7280cr3-2:~# ls /sys/block/ loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 **mmcblk0** mmcblk0boot0 mmcblk0boot1 **sda** - +``` We would instantiate an object of the StorageDevices() class -storage = StorageDevices() +`storage = StorageDevices()` -storage.devices would contain {"mmcblk0": , "sda": } +`storage.devices` would contain `{"mmcblk0": , "sda": }` we would then get static and dynamic information by leveraging the respective member function implementations of `SsdUtil` and `EmmcUtil`, as they both derive from `SsdBase`. -Note that eUSBUtil and NVMeUtil classes are not yet available. +**NOTE:** eUSBUtil and NVMeUtil classes are not yet available. We then leverage the following proposed StateDB schema to store and stream information about each of these disks. @@ -206,6 +205,7 @@ Example: For an SSD with name 'sda', the STATE_DB entry would be: 1. Support for eMMC, eUSB and NVMe storage disks 2. Refactor `ssdutil` [in sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/ssdutil) to cover all storage types, including changing the name of the utility to 'storageutil' +3. Rename `sonic_ssd` and its constituent scripts (`ssd_generic.py`, `ssd_emmc.py`) to encompass all storage types


-[Back to top](#1-overview) \ No newline at end of file +[Back to top](#1-overview) From 24e2dc43be224e6855d5a544a658e6a46c71889b Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Wed, 1 Nov 2023 20:02:11 +0000 Subject: [PATCH 07/26] Minor changes based on staphylo review comments --- doc/ssdmond/images/stormond_SequenceDiagram.png | Bin 71747 -> 0 bytes .../images/stormond_SequenceDiagram.png | Bin 0 -> 67742 bytes doc/{ssdmond => stormond}/stormond-hld.md | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 doc/ssdmond/images/stormond_SequenceDiagram.png create mode 100644 doc/stormond/images/stormond_SequenceDiagram.png rename doc/{ssdmond => stormond}/stormond-hld.md (99%) diff --git a/doc/ssdmond/images/stormond_SequenceDiagram.png b/doc/ssdmond/images/stormond_SequenceDiagram.png deleted file mode 100644 index c553d64254c2cc810dbfc0e57a44b52b8eafe248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71747 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 Ct0mx_t;ju7-Vh~(}PzTdupUyOB{C@Q85;4Y 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

4d;V{Cqkz&e9DZ@Yq%0r{9Fc9g1zW&=XRWO zT3>nUT2&7#KeVg;ndCYKBk&_1_^zWe;LZb%D25@xSjfuE+ifdtcjfcNmP5^JxESSO z)FxpQ2rpk&`LzT6h4met!3@Un)m*ym@4Fjb*J#xCUa|+Vp<1KiBn$$hWo(O>e03o$ zD5>q_42?{Sj~>gh9wDpT_%=*%t09SOnHW83FN%bkG;^Yl&4$Z;0m!QyZQsP2Cksb49{wz4N2>WO$@~52%$E}tzH`YB z@N=rFldT-N4YUAiMPcn%?Kj3X4cKG9erqrW)iXz5ee8u=HF>pa&APil6v}? zh$9i-jeFZ2DZ^m^noL!au6FfA@TSo4 z8+A>Gj&PAKa=le{!2rE&+fPS;pz*?9vigi%O4YauS&{K+^%qHfob2nSHi+aP5+isr zxHU>J17j58ff~Qws3vVe&tvteMOo2>23yZf!V(wxjY@1Uajfzv?4 zgff43<>FEh@TAGVvq(wYrfdYqn%0>GDkAo&AQDy=N+LgXFJ559Cs(yPDHrO$v&6msX?Y#LLPQK&ocdaLBv1o2vv49~icap=baXThj z&vW>Hkyny+ZtOVq8_gZ_DVeysRBGx|V?+~u@?4U3NrEm>VDVsnOSK8;nIH`Lr7SF2EWyK`6nA_ZtS6n z493#X9g;j2yIzKKX?q1k99U!fPr5&|dpVEZ?2n+7Y}d|R-TGF*HEmW+CbPSBI~aZ)C#qPLF$_IW{wPhB7wh{F5DU@O{JPr z`Y&7S8e+)sOPaSQp8ilaeKW}6Ha}0a^zr*j7h!2je{o*|U}D;Hs#^2!Bb{mY-0<-k zqU_cvvp4QD|EOu2!67uow!;`n!qe0aKu1PI!A$)_hNMC_#iqkhqwbw4wxTV(TL#{> zLw8_bj`{RsO(M2VcNk|mCb~;NbmxYBn@R+N2iLnF3qXy-yHbbReAfc^$@12 z)oi8jo0Vw-;aMLjznt55Yv(OCXr0x`0sxwPX8oN?JjyPyPuN}D(LAed29zjl0Tw1^ zesZ@RrhZE}{XRGM9P}`;WanZhT{!&I>5GTR`KuL}aovtPmnhx&;x%_-O5{qY+4|5t zOl52_CT06@R3Z~H`D%SXWLb_NZ}%a+)dUmebF?nRGY+JaI>}ugm=i9n=52+b9lgKd zdGyabk$@M8&3#OZLDZD(@W)azNd??iV|JqDEL(v^hXkx`$XhoNL*-KK2c6+EgX(7J z{eCc%SBnrN!EhOI&k!GV>wr|nZjL-d&j{*8G9{+NO*3&7%CI)Ch}uM|^ei@!!9Y81 zot>}EtnA2x18L~0d#x6*o9!aW)Vv~9BI#<{abWdERVaAt0W0i7AgKWB%dt(O z)jqOYvb6`?Uyxt>S3s|IpQFS8;GeBDjw|Td55S5xvL?V)9Zi`0AL~)bobe@+I5v4% z_1X!oFJlTMmoQn)dWfl)9(;MN*Zby(cqNg`b>7UMq=KB^sEl{Z25;FU524o(XVh!n zq;`g&b%AUjkfIk%d~~!(7d%o7>41E1p`uAgK*U(zlfx7gz-hR z2MM1+D-6cz2Q9R{6e416!BYS5m_m=PT z*m^NAcgZD&+{|zu23w^+1d21NIN)6YHh8xBjy?}ALatJUZWD`5KdAHaPFuelx~&FJC`&qDa~N-t3oNqn%=X77XBY?E?>I(}W6{)4N`F zphQn<>lG+$i`IDq2D^&G6sa3KUhhTh&(mGqR;+ncZm*V2$&pFUt^v|^(VEjKqhWiQ zFh=e)H}AVle*4%6W<~3^UC_S1qJFmDQqNdbyM6j);UeM8fbabW)B&YgY5k{nY`# z?)~Y^O)Y2N9NgmoqFo9mA)L*rAPEOfuYRi}|9PUV9+8hUMD!4}hP6Z~u_2F88MVU3 ztLf>tz8;UmM6S^p<>=_?=clah8N0#NR?Et5F=MV>g`uw;L#9>5$y-LF8dBhy-RfxxhZ zF3a>;a~{bJz&N!G?0upPA88UEOce)V>2!9>hvls^mP)1Y&JR^S)S3%{^X9rAbwLUs2b~I; z)-rxEMkd)_89seDPADyQkvOjX)kfq_c3h`XZTvwJ43@huHpqLZY%pWEk#oo;Ra;)A z1YLbc_AZ%o0vio?0JNf?qF+dmMmvg`YMhRnt(ZhT*^aO^+J0zw(U1JKtv~kIWz1$T z1b(Gnq%HlkeHM(PD?mB4VrtLRNevAKrWaCROV*A)Zvr*V=6qeof7}UZT}Gv1+r?K^ zlrztH4n0R|o6!dE?Rm#`x7Z@hgQEQ1uQ`kXyL}j&5-wEn?xPSZ++y#wo3Z1vuF3uf7uxD?+SofYHzQATPI<-jj;(3Snz>yB@gY9yGgzlG z{~N*hJ3VY7)6Ppdn}o4d6zC`an8lrL#+;fc_c7&7($c=B={L>J<>+h82z)NK9YtWY z%!Ugw7j?`+p*Bf|{h71E{{UzUz+Py__-vOnO#2=pEkS43UJ<{q|5^xygByXdn6K5d zu65vKlQ77gL4H#LeRAmzn>gvuoBJ5IO3h|Y-h?V@tK@ERpZQY1FJ^I`-O``0CX0{y z0|A(eLh+ozwf@R~UJcY+8^{~ChzcnP=^l`Gl6qD&tOM{|{j6Da+;g?+NyD{KtP2Wk z18k%K$j$_j33NVbXP;^)=Z-_w6cytVS)p2=3NW*u{&IsMawd*?!pDIKa?ryVL4tx5 zFdSXQQQsk;Tc?PTG}}jJ7Iy}+Zgcjz%}B0;_jm`pHrWYBwiT{vZ1t{B`iZ~l$erz< zIijsi?A7N|O%qc&IyM_Jf?GRnK+;H%!f>R1&Na54cF_x%c(&8{X;PF)86AZZvmHF& zZd?m8-YQ}oa(WR!f#UFNhj<3;VE^<<7gw`mB5CjmQh=#KKZ>Z^1ns~Wpb5~4lz1`P zoE+#~@ycfvnjFEtEXWIG(5aO`B0Xw|-y3&1yj{mC=_0V)wRu2B6RWfy(v0 zK8HYnc5?lHsa(;7ilQbf$GZxxW+GRPrMv>*P7n^vdAS#vOcg5oQThbKKpQJ?RM@DS z=|o+fF_J(TO-yC$-UrcKs2(+7H1MT43>Ub#N4pDfB$t2-*T3%q?%f7D_NaK_ziiK* zrGu@miQW^Hf$GG@K_o~-4hQQ%jHP^z%lMBV7c(h24s?kt4?mr8rG_h)7bjLz?N8R+ z3b}hXrRFUrzQ-ycV<0Ad9J@nU%9WTg(a3pn5cf1pap&B`Ts) zKwyeTPrOVWt```jQGzN(CHvNg-B7hWBO50UL4~F{(102CeLemFqKpbu_Vi84a674$ ze&@!GFL?fB3(Mg*0OMeHVc2~x7<*`g`_Hx|U_U4thP$2^So9Nj1lhyrV?bYr-H+#N zXXs0D?u?Qv5QPcFXE)dAUC|Exouhiqo`V1_|Mk0rhk+#9iH_}m*4tGVutAu!kAyY7 z7H+R4@Mn};v(eCpjbyVg1dEhvE=nieGT2Dl%s)Zc6leY6A?C72+bj}ic11_`8CEf+ zAG+CX&DIsbN7?6L%Nvr%7DWN77RW#h-vL@!W3oA8Ged01s`t6@VhbtENQuJvWP7w` z_;ZNNPqV~Zn^qSkv`F2j&XffP61k++<19!b86_3ib}A#WgfUb4Pv`<+xz9hI9XKmux`AK~Qxu}Eu0;gg8q^shM{R$e7s!bT$%zw`Hh zscJAZ0B#Y@DRwFD{4f8fRO9q$7xjPmKS+IS{)hFWi7h%Ng08`Mj8UB~5U;fV2~HFN zInjxf>?Q;ov%dpO5D9b{)o~+OP#130T@vbYa=)9l{r4HpVjF~3$dqV!T<_^@zz*@J zPx0~9w#-{*i};NeL7KsdB9UMr>A|k043x=KOIc%2$$k{=3rA3*k_eR`_{FfhIHdin8Bijv>g{ zdF)bwsA3Epj?JU`5r=?T3rAQi%iMHWY?xk}Fg+2WY7qMX+BY_S#Et^NH_c@Lm*NY% zrhyUa!}+>3(8@{JwjZSe0Zp>4FsS=;8e>L!@O9_voO{W+(S#bHY#!yf;mQ54A?g3L z@ae%4O^KcLvAJdx0Uw}98GB3-M`Hs~J3EaY6i^8f7l#Zk=|{M2{Imt59+WtqlaRFi zyAJ=SCw~ej%D>)@B#-5UL)>}|QWg9s9M<3*;e@^zNrR@^op%0BaSqT9ObD{^eL#L0pc_6itTWUIq-iZ)Hyb$EVvJIqtpA2G4;pg@=^mad#Nsb z8Yp;Z3hPef1x{Q1pr1_BW*;YmVMv%Ba#jqgM+bI`5Gw{vQy$6UEVN= z1nT~X|6GPPTOi5~$AVJU&wl^1|HXdJaCt^Z{f2wIM{SlmW&;+E3FPrkYm4z zsx3;>#~vAqvJKzQJ|g=}WThWn02SiL#dH(aG3WSVqVd*2P1gThgU$aQu~0Xkf{6ED zM;08Vi2(0M?=!hLVf~D4!e|m8aRT)J=TUkJw|=_AmuM!NYiSrv zcXTu4d?HGKV_<&(jPC$tK@CPAYzSGL%xl<=oQUpJ+k#f0Pwq?Dn1nfvf{uzt$aKdx z7Bb{IQy8mpHdaZdvooPi>>uG&&wmeN?!k~BzIIn>mJ&RE^{GZ+??)J2rrBFn0idPu zqz1r%_>UBjI{!8!f}661pMZYFf^k*KIT69_u&cywu+rCACZg1b6U z&)LXaa|UuwU_+$S@SwzrHxo7CWhZ^v6u_h!=oK{5oel+=J4nVW0BA>nZPEv>OLEf> zoF3&gbc--gYEpF04aUPH!gQzq)$DqEI0w|6ulaFgX;vI5Tu+mUANdH8 zI+7@z9W9{&w)x%I6R~8CAu~esul>wg5(#QXgM)1A3yOcId4!~t%v{j`B<=Y!<3;C2 zB@Nac^QY7gJ2k{X3`+Nir{caaLdQV<$C^?!iKy;mEWFz?qU0k`q+6JLZ8<=J%Evcj!cjn#|l! zG~FaE>tVzkiYG=COsOH|Ie$YtC_t7YO5S_D_s3lMt=;bd;Qw)+w~U zT1sWpKQhIT1KNxzw8^$hZ3YV+)8iwpbG`03wo45_lKi46u=m#^*~bjVJdwTfvWJan zT3EtW?Fm6mfn^6{lJBUugD)A}6gU!Qa|&u{#iVJ*_HD_{>r93`YW(A;bs9SSqdftP zgyD|F&~lptZ7RR}_)@1SBfm`TSZOQx8^?K4mH&w{*{BV9i6U&$no5d{k)RfsJVo>y z`{HGGwbhd@`V4&(ubE10+wnm5D~a^VwZu?E!Qv4m_OBtuskSQoIfS&Ji2d(B_tU>W za#P*QejOYRKYUE-OO)Qr{=L3U*BscFWjuVf4%hNhzUolB)C(*z&P996IMJVm-B)@| z-;<_RS)?0mbF8X)qQC@bM`-=`YZS6s_{Qj z_c`JJY46&jnmo@qy{xplL1|a5Q0#+LZX;29PO9Zrb zS}GMpgjOJQ5x~@vbm_WmC8>fgZ54k{<7c z?JUy0%L0ic>dLP!mh<-L=lHdHErG};IUkxJwJT%VZ6-J2Nk~<3cHcg);JU5W-ikhn zZI`R3^=8CqgS>Hc^v25vk{H{8e=_SP%L3MA_`BT^z3CfdnZB)w+Hv%* z+)M;II>55rIUw!NRouuW{m@!gY{R<6V2Gg*soL>Ix8c-A>%`Ko6#0tu2<%$(5+T4} z%bKuYg(A71nooirYkDoW;&mzm<7_xT5@s?dtI#R!edlXg+U7Ng z{a&}G_dt0@wtRDPJxpxe`eC==_%}{+1_Vq_uN);iBrg?>4@|XOp zeWTl3M)S(Z(N=gso+;ng-c)x@=P>w@w(z1nbCi3zu=TX&NK-t|@|Z;T8;#e^A+gR& zbGS3CvVQ29N@nO-L)3{8HA5PEA)KX-%h7pj1mifxLoG5Wp5(D&s#k0McIf9Ff3-?t z&}mehrm=OshmH!3HjdR$ddL;`KUzLg;GPt|IKO{a`H25LY(Lg}Yeymn*wN0ua5aeV z2qCXv`woo3HNA%t(2yl55md@)=GXT)U&??sD&P5t4(dp%8k@C0Pagok)K1C zk85UyVwbAM>=g;5IbYmgDo0tv9iTh637>LPPl+P9R9xBg}bVY*kk%!{8 zu&diEM*J5bi=e-H$q8;A*9}Qg+=6Qiz$+uux!JKpJ2mXynNMR!Q0taIu8%kRWJpwN zC0QqQ*r2fRNUE>#WXzt$q1vnCjZRtNSqWI5dIkk|*&oX0GGoel3()VpkDORH5NXRf)QZ`EtjTzl zJHeXJUqfe;&&}!VV=hZ#MhWYMzZcOzE9;n;jn^82a=7A=80!z4ER`-_7k}-7@xgZ# za?(dhiEv1uW3z3G0#vvO*V4@dG?qc8bpl+EX{<)87^4s04eTgitLm+tAV9CbPF_FHMs&sH5_oLo0x zIJ3b2p8D$G@)IMYn?ALkhV-Jd3luMfUJMu*d@jeya@2W7RYLcV{CZr9B( z>DxHYzudj#);M{Q`D1%**1C|v?6u%FY?_wT3{KVygv0#w>GjRA(|zF}bE& zqktuwg&)Rif4=60?%GTI%lF@2N!KIt2c>K*dr`w)h0Wen+0Ew_TWuMBuoxv_LiN$f zU%v8{&cR$))A^f%W!+wnF{5hhF7ca>-uG4YWP72e0>4e!(_NevK3c`7XKC%CW(&gf z2;1?zK4^u;sxJU0}nh1coWV7*?>)0vR68L(OKE^Zl^rCVVcoJ(YtFR^-RnY);Z`*#`kKzBGz4W1LoJo0JDFi`B(u@?iYPJja{K>{(hHF6wd^~0n z3bxw;9RTz3KHF;3L@vJ@$PWa&w%YE1t@Xti-e~OO**bS4}@qxsr{ir$IBB#gNsOGQU~|; zZAU8Esj;6k0!;0KSgT! zS|E8;ryGcHC?PR26UJ>}XOD=qaC1f?yJ1)`MVjD1to{G$Y5%az9|*BkQ_>0GRuBSs zgxEh6po3wRYy<32Mjm~F(qS&w>YO0^cU@-j?wg9#*Z)4yQb`o7fT?lvQ`r4waL=gA zced@WiBAGu*?c@OY?6IGhx#bd)(C061qx0xT!PymTsce)3#GUNRdC8t%k=>n<&PZ% zf#R8uit{qSpX6wM8&! zf0TNlYis&XEL?Ih(NVaLiMIm$NLIZ8q~2DH>)m0Kv(*CwaBtu@hur&5fu#hnIN|_l zTp=8h2h$tlVozd-RxX_y`xN959)BCnJTTRBDX}(26;TEcki!ko%O;{>Qs0>NYm$H@ zWS6|5Lo+D=CScF!2S3HgG95q2{4jYh^SlZ!6Aw5M@b-2qf`DO~`a$Ln$!6^AY0iDo zuUJf8EVNy+Cio>tIAR%>reH`IGAml;!7Kk=!t4y4y z)Jy23Uz*eI?YFYs25!@72p0I0muk{cVe$SSK=LAr=KYiHKkE_^39yfw;j5zzY_>BP zfg$io7sD3{?#Z%MiAb$wPU&>13h^a3hGrrhqs`pKF3qQ)JEGR$c}IVY%ol(uiTx)6;x;AljaqN%?5J$D}8qZU&W^>^9O z{QtJt)%_?Nq5SXXwn|WHJ_D=*Z7}n3b_eYA09t)o%6BR{s?#_BZBO@x$T~)aR2m>m zPr3Ci-rtJtXBl~wdaGrceN+3tWlcL=%ql4s7XQV);AEj`uK!WC_P6f%|FhD%mKZI) Y?{5C(M)~I-(Ve_K*RL%4&Bpis0y=*9=l}o! diff --git a/doc/stormond/images/stormond_SequenceDiagram.png b/doc/stormond/images/stormond_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5229c5201c35154292e2c43fff0bd385abfadb GIT binary patch literal 67742 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

gBR@Nf?M>X=Fi;vkeL6pS4(3oL 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

|x!QL2 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 xFXaZBDY~9Z{FnT>X)M`r^ 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 literal 0 HcmV?d00001 diff --git a/doc/ssdmond/stormond-hld.md b/doc/stormond/stormond-hld.md similarity index 99% rename from doc/ssdmond/stormond-hld.md rename to doc/stormond/stormond-hld.md index cad90fe27d9..a6f82b05e07 100644 --- a/doc/ssdmond/stormond-hld.md +++ b/doc/stormond/stormond-hld.md @@ -107,7 +107,7 @@ Returns: #### **2.4.2 Support for Multiple Storage Disks** -The `ssdutil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. It could also be a different type of storage device such as eMMC, eUSB or NVMe. +The `ssdutil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. It could also be a different type of storage device such as eMMC, USB or NVMe. In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()` which will accompany the stormond daemon at `sonic-platform-daemons/sonic-stormond/scripts/StorageDevices.py`. This new class provides the following methods: @@ -129,7 +129,7 @@ def get_storage_device_object(self): Instantiates an object of the corresponding storage device class. Adds the instantiated class object as a value to the corresponding key in the dictionary object. -NOTE: SsdUtil is supported currently. Future support for EmmcUtil, eUSBUtil and NVMeUtil +NOTE: SsdUtil is supported currently. Future support for EmmcUtil, USBUtil and NVMeUtil """ @@ -161,7 +161,7 @@ We then leverage the following proposed StateDB schema to store and stream infor ``` ; Defines information for each Storage Disk in a device -key = STORAGE_INFO| ; This key is for information that does not change for the lifetime of the SSD - SSD_INFO|SDX +key = STORAGE_INFO| ; This key is for information that does not change for the lifetime of the SSD - STORAGE_INFO|SDX ; field = value From 31cb0becc2800700c8d04c3982e74eee92b86d1c Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 24 Nov 2023 01:05:09 +0000 Subject: [PATCH 08/26] Added new class and member function logic info. Made changes to StateDB schema per review. --- doc/stormond/stormond-hld.md | 82 +++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 15 deletions(-) diff --git a/doc/stormond/stormond-hld.md b/doc/stormond/stormond-hld.md index a6f82b05e07..49c3203fbed 100644 --- a/doc/stormond/stormond-hld.md +++ b/doc/stormond/stormond-hld.md @@ -95,7 +95,7 @@ Returns: An integer value of the total number of I/O writes """ -def get_reserves_blocks(self): +def get_reserved_blocks(self): """ Retrieves the total number of reserved blocks in an SSD @@ -122,6 +122,7 @@ devices = {} def get_storage_devices(self): """ Retrieves all the storage disks on the device and adds their names as key to the 'devices' dict. + """ def get_storage_device_object(self): @@ -132,12 +133,57 @@ Adds the instantiated class object as a value to the corresponding key in the di NOTE: SsdUtil is supported currently. Future support for EmmcUtil, USBUtil and NVMeUtil """ - ``` -This class is a helper to the Storage Daemon class. +This class is a helper to the Storage Daemon class. + +**get_storage_devices() Logic:** + +- In the base path of `/sys/block/`, for each fd: + - If the fd does not have `boot` or `loop`, add it as a key to the `devices` dictionary with a temporary value of `NoneType` + ``` + Example: + admin@str2-7050cx3-acs-01:/sys/block$ ls | grep -v -e "boot" -e "loop" + mmcblk0 + sda + ``` -Example usage: +In the example scenario above, the dictionary `devices` would look like this: + +``` +devices = { +'mmcblk0' : None +'sda' : None +} +``` + +**get_storage_device_object() Logic:** + +- For each key in the `devices` dictionary: + - If key starts with the term `sd`: + - If the realpath of `/sys/block/[KEY]/device` has the term `ata` in it: + - Instantiate an objectREAD NOTE of type `SsdUtil` and add this object as value of the key + ``` + Example: + root@str-msn2700-02:~# cd /sys/block/sda/../../../0:0:0:0 + root@str-msn2700-02:/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0# + ``` + - else if the realpath of `/sys/block/[KEY]/device` has the term `usb` in it: + - Instantiate an objectREAD NOTE of type `UsbUtil` and add this object as value of the key + ``` + Example: + root@str2-7050qx-32s-acs-01:~# cd /sys/block/sda/../../../2:0:0:0 + root@str2-7050qx-32s-acs-01:/sys/devices/pci0000:00/0000:00:12.2/usb1/1-2/1-2:1.0/host2/target2:0:0/2:0:0:0# + ``` +- else if key starts with the term `mmcblk`: + - Instantiate an objectREAD NOTE of type `EmmcUtil` and add this object as value of the key + ``` + Example: + root@str2-7050cx3-acs-01:/sys/block$ ls | grep -i "mmcblk" | grep -v "boot" | grep -v "loop" + mmcblk0 + ``` + +**Example usage:** Assuming a device contains the following storage disks: ``` @@ -148,27 +194,32 @@ loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 **mmcblk0** mmcblk0boot We would instantiate an object of the StorageDevices() class `storage = StorageDevices()` -`storage.devices` would contain `{"mmcblk0": , "sda": }` +`storage.devices` would contain: +``` +{ + 'mmcblk0': , + 'sda': +} +``` we would then get static and dynamic information by leveraging the respective member function implementations of `SsdUtil` and `EmmcUtil`, as they both derive from `SsdBase`. - -**NOTE:** eUSBUtil and NVMeUtil classes are not yet available. +We then leverage the following proposed StateDB schema to store and stream information about each of these disks. -We then leverage the following proposed StateDB schema to store and stream information about each of these disks. +**NOTE:** `UsbUtil` and `NVMeUtil` classes are not yet available. `EmmcUtil` class does not currently have IO reads, IO writes and Reserved Blocks support. ## **3. StateDB Schema** ``` ; Defines information for each Storage Disk in a device -key = STORAGE_INFO| ; This key is for information that does not change for the lifetime of the SSD - STORAGE_INFO|SDX +key = STORAGE_INFO| ; This key is for information about a specific storage disk - STORAGE_INFO|SDX ; field = value temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) -io_reads = INT ; Describes the total number of reads completed successfully from the SSD (Priority 0, Dynamic) -io_writes = INT ; Describes the total number of writes completed on the SSD (Priority 0, Dynamic) -reserved_blocks = INT ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) +io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (Priority 0, Dynamic) +io_writes = STRING ; Describes the total number of writes completed on the SSD (Priority 0, Dynamic) +reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) @@ -203,9 +254,10 @@ Example: For an SSD with name 'sda', the STATE_DB entry would be: ## Future Work -1. Support for eMMC, eUSB and NVMe storage disks -2. Refactor `ssdutil` [in sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/ssdutil) to cover all storage types, including changing the name of the utility to 'storageutil' -3. Rename `sonic_ssd` and its constituent scripts (`ssd_generic.py`, `ssd_emmc.py`) to encompass all storage types +1. Enhanced support for eMMC +2. Support for USB and NVMe storage disks +3. Refactor `ssdutil` [in sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/ssdutil) to cover all storage types, including changing the name of the utility to 'storageutil' +4. Rename `sonic_ssd` and its constituent scripts (`ssd_generic.py`, `ssd_emmc.py`) to encompass all storage types


[Back to top](#1-overview) From 8db4f8c799113fc1d897cad52c0e93846b6742e6 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 9 Feb 2024 21:55:57 +0000 Subject: [PATCH 09/26] Mde changes per prgeor review comments. Added Class diagram. --- .../images/StoragemonDaemonClassDiagram.png | Bin 0 -> 65568 bytes .../images/storagemond_SequenceDiagram.png} | Bin .../storagemond-hld.md} | 52 ++++++++++++------ 3 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 doc/storagemond/images/StoragemonDaemonClassDiagram.png rename doc/{stormond/images/stormond_SequenceDiagram.png => storagemond/images/storagemond_SequenceDiagram.png} (100%) rename doc/{stormond/stormond-hld.md => storagemond/storagemond-hld.md} (75%) diff --git a/doc/storagemond/images/StoragemonDaemonClassDiagram.png b/doc/storagemond/images/StoragemonDaemonClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..2b556e9809ac563a249b6d42e68a6125aa62d6e3 GIT binary patch literal 65568 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
jk>`p&>iAQV7oZ1=qXWN*!*(N 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 N)RncBD$bY({T~Hxq`UwC literal 0 HcmV?d00001 diff --git a/doc/stormond/images/stormond_SequenceDiagram.png b/doc/storagemond/images/storagemond_SequenceDiagram.png similarity index 100% rename from doc/stormond/images/stormond_SequenceDiagram.png rename to doc/storagemond/images/storagemond_SequenceDiagram.png diff --git a/doc/stormond/stormond-hld.md b/doc/storagemond/storagemond-hld.md similarity index 75% rename from doc/stormond/stormond-hld.md rename to doc/storagemond/storagemond-hld.md index 49c3203fbed..3c778854720 100644 --- a/doc/stormond/stormond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -11,7 +11,7 @@ This document is intended to provide a high-level design for a Storage monitorin Solid-State Drives (SSDs) are storage devices that use NAND-flash technology to store data. They offer the end user significant benefits compared to HDDs, some of which include reliability, reduced size, increased energy efficiency and improved IO speeds which translates to faster boot times, quicker computational capabilities and an improved system responsiveness overall. Like all devices, however, they experience performance degradation over time on account of a variety of factors such as overall disk writes, bad-blocks management, lack of free space, sub-optimal operational temperature and good-old wear-and-tear which speaks to the overall health of the SSD. -The goal of the Storage Monitoring Daemon (stormond) is to provide meaningful metrics for the aforementioned issues and enable streaming telemetry for these attributes so that the required preventative measures are triggered in the eventuality of performance degradation. +The goal of the Storage Monitoring Daemon (storagemond) is to provide meaningful metrics for the aforementioned issues and enable streaming telemetry for these attributes so that the required preventative measures are triggered in the eventuality of performance degradation. ## 2. Data Collection @@ -50,15 +50,17 @@ We are intrested in the following characteristics that describe various aspects These fields are self-explanatory. -### **2.3 `stormond` Daemon Flow** +### **2.3 `storagemond` Daemon Flow** -1. `stormond` would be started by the `pmon` docker container +1. `storagemond` would be started by the `pmon` docker container 2. The daemon would gather the static info once init-ed, by leveraging the `SsdUtil` class and update the StateDB 3. It would parse the priority 0 attributes by leveraging `SsdUtil` class and update the StateDB every hour. +**NOTE:** The design requires a concurrent PR wherein SsdUtil class is enhanced to gather IO Read/Write stats and Reserved Blocks information as detailed in section [2.4.1 below](#241-ssdbase-api-additions). + This is detailed in the sequence diagram below: -![image.png](images/stormond_SequenceDiagram.png) +![image.png](images/storagemond_SequenceDiagram.png) ### **2.4 Data Collection Logic** @@ -109,7 +111,7 @@ Returns: The `ssdutil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. It could also be a different type of storage device such as eMMC, USB or NVMe. -In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()` which will accompany the stormond daemon at `sonic-platform-daemons/sonic-stormond/scripts/StorageDevices.py`. This new class provides the following methods: +In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()` which will accompany the storagemond daemon at `sonic-platform-daemons/sonic-storagemond/scripts/storagemond`. This new class provides the following methods: ``` class StorageDevices(): @@ -127,10 +129,15 @@ Retrieves all the storage disks on the device and adds their names as key to the def get_storage_device_object(self): """ -Instantiates an object of the corresponding storage device class. +Instantiates an object of the corresponding storage device class: + +'ata' - SsdUtil - Full support +'usb' - UsbUtil* - Not currently supported +'mmcblk' - EmmcUtil* - Limited Support + Adds the instantiated class object as a value to the corresponding key in the dictionary object. -NOTE: SsdUtil is supported currently. Future support for EmmcUtil, USBUtil and NVMeUtil +*NOTE: SsdUtil is supported currently. Limited support for EmmcUtil. Future support planned for USBUtil and NVMeUtil """ ``` @@ -206,26 +213,37 @@ we would then get static and dynamic information by leveraging the respective me We then leverage the following proposed StateDB schema to store and stream information about each of these disks. -**NOTE:** `UsbUtil` and `NVMeUtil` classes are not yet available. `EmmcUtil` class does not currently have IO reads, IO writes and Reserved Blocks support. +**NOTE:**
+**Full support** -- monitors all the attributes mentioned in [section 2](#2-data-collection)
+**Limited support** -- Support unavailable for Dynamic fields mentioned in [section 2.1](#21-priority-0-attributes)
+**Not currently supported** -- Class currently unimplemented, no object created. No monitoring currently available.
+ +`UsbUtil` and `NVMeUtil` classes are not yet available. `EmmcUtil` class does not currently have IO reads, IO writes and Reserved Blocks support. + +#### **2.4.2.1 storagemond Class Diagram** + +![image.png](images/StoragemonDaemonClassDiagram.png) ## **3. StateDB Schema** ``` ; Defines information for each Storage Disk in a device -key = STORAGE_INFO| ; This key is for information about a specific storage disk - STORAGE_INFO|SDX +key = STORAGE_INFO| ; This key is for information about a specific storage disk - STORAGE_INFO|SDX ; field = value -temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) -io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (Priority 0, Dynamic) -io_writes = STRING ; Describes the total number of writes completed on the SSD (Priority 0, Dynamic) -reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) -device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) -serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) -firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) -health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Priority 1, Dynamic) +temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) +io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Priority 0, Dynamic) +io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Priority 0, Dynamic) +reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) +device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) +serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) +firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) +health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Priority 1, Dynamic) ``` +NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by 512B. + Example: For an SSD with name 'sda', the STATE_DB entry would be: ``` From 0c53764c32f8f262829ea1d94f67741789cbbbb2 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Thu, 15 Feb 2024 01:47:09 +0000 Subject: [PATCH 10/26] Made changes per prgeor review comments. Appropriately modified the class diagram --- .../images/StoragemonDaemonClassDiagram.png | Bin 65568 -> 84981 bytes doc/storagemond/storagemond-hld.md | 167 +++++++++++++++--- 2 files changed, 140 insertions(+), 27 deletions(-) diff --git a/doc/storagemond/images/StoragemonDaemonClassDiagram.png b/doc/storagemond/images/StoragemonDaemonClassDiagram.png index 2b556e9809ac563a249b6d42e68a6125aa62d6e3..8f7580f500197b2eaf0e578b3602e1f568b68df2 100644 GIT binary patch literal 84981 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
Tbmi952 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 N)RncBD$bY({T~Hxq`UwC diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 3c778854720..97e7f44e924 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -21,12 +21,16 @@ We are intrested in the following characteristics that describe various aspects **The following are dynamic fields, offering up-to-date information that describes the current state of the SSD** - - IO Reads - - IO Writes + - File System IO Reads + - File System IO Writes + - Disk IO Reads + - Disk IO Writes - Reserved Blocks Count - Temperature -**IO Reads/Writes** - SSDs use wear-leveling algorithms to distribute write and erase cycles evenly across the NAND cells to extend their lifespan. However, write amplification can occur when data is written, rewritten, and erased in a way that creates additional write operations, which can slow down performance. +**Filesystem IO Reads/Writes** - Parsed from the `/proc/diskstats` file, these values correspond to the number of reads and writes successfully carried out in the partition hosting the SONiC OS. These values would reset upon reboot. + +**Disk IO Reads/Writes** - SSDs use wear-leveling algorithms to distribute write and erase cycles evenly across the NAND cells to extend their lifespan. However, write amplification can occur when data is written, rewritten, and erased in a way that creates additional write operations, which can slow down performance. This information accounts for wear-leveling and is persistent across reboots and powercycles. **Reserved Blocks Count** - Reserved blocks in a Solid State Drive (SSD) serve several critical purposes to enhance the drive's performance, reliability, and longevity. These reserved blocks are managed by the drive's firmware, and their specific allocation and management may vary between SSD manufacturers. The primary purposes of reserved blocks in an SSD are: @@ -220,7 +224,106 @@ We then leverage the following proposed StateDB schema to store and stream infor `UsbUtil` and `NVMeUtil` classes are not yet available. `EmmcUtil` class does not currently have IO reads, IO writes and Reserved Blocks support. -#### **2.4.2.1 storagemond Class Diagram** +#### **2.4.3 Support for common implementations** + +Specific data, such as File System Input/Output (FS IO) Reads/Writes, can be uniformly collected regardless of the storage disk type, as it is extracted from files generated by the Linux Kernel. To streamline the process of gathering this information, we propose the implementation of a new parent class, denoted as `StorageCommon()`, from which classes such as SsdUtil, EmmcUtil, USBUtil, and NVMUtil would inherit. This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, within the file named `storage_common.py`. The `StorageCommon()` class will have the following methods: + +``` +def __set_host_partition(self, diskdev): + """ + internal function to fetch SONiC partition + + Returns: + The partition containing `/host` mount, or 'N/A' if not found + Args: + N/A + """ + +def get_fs_io_reads(self): + """ + Function to get the total number of reads on the 'SONiC' partition by parsing the /proc/diskstats file + + Returns: + The total number of partition reads OR disk reads if storage device does not host the SONiC OS + + Args: + N/A + """ + +def get_fs_io_writes(self): + """ + Function to get the total number of writes on the 'SONiC' partition by parsing the /proc/diskstats file + + Returns: + The total number of partition writes OR disk writes if storage device does not host the SONiC OS + + Args: + N/A + """ +``` + +**__set_host_partition() Logic** + +This Python function, `__set_host_partition`, is designed to fetch the SONiC (Software for Open Networking in the Cloud) partition containing the `/host` mount. The function utilizes different logic depending on whether the `psutil` module is available. + +Here's the logic of the function: + +1. **Check for `psutil` Module**: + - The function first checks if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. + - If `psutil` is available: + - It iterates over each disk partition obtained from `psutil.disk_partitions()`. + - For each partition, it checks if the mount point is `/host`. + - If a partition with `/host` mount point is found, it returns the base name of the device associated with that partition using `os.path.basename(p.device)`. + - If no partition with `/host` mount point is found, it returns `None`. + +2. **Fallback to Parsing Mounts File**: + - If `psutil` is not available: + - It reads the contents of a file specified by the `MOUNTS_FILE` attribute (presumably a file containing mount point information). + - It then iterates over each line in the file. + - For each line, it checks if `/host` is present and if `diskdev` is present. + - If both conditions are met, it returns the base name of the mount point using `os.path.basename(mt.split()[0])`. + - If no matching line is found, it returns `None`. + + +**get_fs_io_reads() Logic** + +1. **Determine Search Term**: + - The function first sets the `searchterm` variable to either `self.partition` or `self.diskdev`, depending on whether `self.partition` is `None`. This is done to ensure flexibility in searching for the desired partition or disk. + +2. **Check for `psutil` Module**: + - The function checks if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. + - If `psutil` is available: + - It retrieves disk I/O counters, specifying `searchterm` as the disk to get the counters for. + - It then returns the read count for the specified disk partition. + +3. **Fallback to Parsing diskstats File**: + - If `psutil` is not available: + - It reads the contents of the `/proc/diskstats` file. + - It then iterates over each line in the file. + - For each line, it checks if `searchterm` is present. + - If `searchterm` is found in the line, it returns the value in the fourth column of that line, which represents the total number of reads. + - If no line contains `searchterm`, it returns 'N/A' to indicate that the information could not be found. + +**get_fs_io_writes() Logic** +1. **Determine Search Term**: + - The function first sets the `searchterm` variable to either `self.partition` or `self.diskdev`, depending on whether `self.partition` is `None`. This is done to ensure flexibility in searching for the desired partition or disk. + +2. **Check for `psutil` Module**: + - The function checks if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. + - If `psutil` is available: + - It retrieves disk I/O counters, specifying `searchterm` as the disk to get the counters for. + - It then returns the write count for the specified disk partition. + +3. **Fallback to Parsing diskstats File**: + - If `psutil` is not available: + - It reads the contents of the `/proc/diskstats` file. + - It then iterates over each line in the file. + - For each line, it checks if `searchterm` is present. + - If `searchterm` is found in the line, it returns the value in the eighth column of that line, which represents the total number of writes. + - If no line contains `searchterm`, it returns 'N/A' to indicate that the information could not be found. + + +#### **2.4.4 storagemond Class Diagram** ![image.png](images/StoragemonDaemonClassDiagram.png) @@ -233,8 +336,10 @@ key = STORAGE_INFO| ; This key is for information ab ; field = value temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) -io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Priority 0, Dynamic) -io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Priority 0, Dynamic) +fs_io_reads = STRING ; Describes the total number of reads completed successfully on the SONiC partition (Priority 0, Dynamic) +fs_io_writes = STRING ; Describes the total number of writes completed on the SONiC partition (Priority 0, Dynamic) +disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Priority 0, Dynamic) +disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Priority 0, Dynamic) reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) @@ -242,32 +347,40 @@ firmware = STRING ; Describes the Firmware version health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Priority 1, Dynamic) ``` -NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by 512B. +NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by 512B.
+NOTE: For fs_io_reads/writes, if the SONiC OS is not on any partition on the disk, this would correspond to total number of I/O RW done on the *disk* Example: For an SSD with name 'sda', the STATE_DB entry would be: ``` -127.0.0.1:6379[6]> KEYS STORAGE_INFO|* -1) "STORAGE_INFO|sdb" +root@str2-7050cx3-acs-01:~# docker exec -it database bash +root@str2-7050cx3-acs-01:/# redis-cli -n 6 +127.0.0.1:6379[6]> keys STORAGE* +1) "STORAGE_INFO|mmcblk0" 2) "STORAGE_INFO|sda" -127.0.0.1:6379[6]> HGETALL STORAGE_INFO|sda - 1) "temperature" - 2) "30C" - 3) "io_reads" - 4) "49527" - 5) "io_writes" - 6) "238309" - 7) "reserved_blocks" - 8) "0" - 9) "device_model" -10) "InnoDisk Corp. - mSATA 3IE3" -11) "health" -12) "92" -13) "serial" -14) "BCA11712190600251" -15) "firmware" -16) "S16425cG" -127.0.0.1:6379[6]> +127.0.0.1:6379[6]> +127.0.0.1:6379[6]> hgetall STORAGE_INFO|sda + 1) "device_model" + 2) "SATA SSD" + 3) "serial" + 4) "SPG2043056Z" + 5) "firmware" + 6) "FW1241" + 7) "health" + 8) "N/A" + 9) "temperature" +10) "30" +11) "fs_io_reads" +12) "28753" +13) "fs_io_writes" +14) "92603" +15) "disk_io_reads" +16) "15388141951" +17) "disk_io_writes" +18) "46070618960" +19) "reserved_blocks" +20) "32" + ``` ## Future Work From 00935dd418e337492057cc1178eaecd601ab1969 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 16 Feb 2024 19:55:18 +0000 Subject: [PATCH 11/26] Added design consideration for bind mounts and reboot script changes --- .../images/storagemond_SequenceDiagram.png | Bin 67742 -> 42607 bytes doc/storagemond/storagemond-hld.md | 180 +++++++++--------- 2 files changed, 85 insertions(+), 95 deletions(-) diff --git a/doc/storagemond/images/storagemond_SequenceDiagram.png b/doc/storagemond/images/storagemond_SequenceDiagram.png index ab5229c5201c35154292e2c43fff0bd385abfadb..eebba924e3c47ae8560c5096daf2e01dd1b20a75 100644 GIT binary patch literal 42607 zcmeFZXH-;Mw=IgIprT+#i7Fr}0s@kw0-_)wk~0X16ck95jDQM?;xVj-l<0q zMV{i};kV-99bP(i82)oT`@0f++_Df=vd}SkX=9}K+yYNb&sfh)+d@zG$}^iQFDxux zn)5I-zckV|wy;DRG3l5fty&tW@$ila8ptVG{P{oLA-Ilp_`IU3$q3hZ$JR`)R2zf% zw{JBbuqCCC88gyEyT9?mw$Z+`KF%@AW$_7lutPv?k(}VQ#QACe*DmqyF|Jpe4Uqcr%;`#G>a2&ig;qvXZiXBIRb-EEDweV{G!9|m0Zu5h*?h|EZkv_694{! z(`eIx!|1NHot>&$PjunV$5^_8V%OTxQ$a|y=ZR0KfxIQMbAv-PM@`R%Jqr?e`0X%? zpJcQ7aSU^aML@K&U9x3!Et%4m!eG;@RSvo0QxrMT`~8yPM!B=C(--n5&MPFC8MeJL zw93SEe~4C{;@I-MOOE*Ro&ib9hD@nbdrLQEnUbI`QF|O~&KjYoG0wsoSSzUMe*DQt zZGs+6qNB%>TwPA=A6X;xsg$FzN?cSPXdcqck zIP~!9`CZb!p!aNK;%ChAui48Dq}IxXV~U1vQO)igQ~8)@d0_Xsoi1F&RXXQ*pk$5M zaa#=vikQ?RwoTYiY$JD%MPKsFbEjY>&bMC8puY0sjZVWkLP}PdljfvD>8$5t+BT+m zDw2}=@uy@)7LLk2-m-A+s8pTfe4Cm|a(msIh?52Bt7$~x<;1FJ^HTkWhTqC)we6T9@OdNyQZkA~!Av-Zb(* zmE?U-MLgz&8{5ZQrv=PqeOk;W=T7(N*&q9MA2Aqn@GgK?PIlTp@NM;&331DcJA(%M zx7VBZc+xb48s*MNB%TcD3^Toj+`g%exEOC27TqZF{9D07-Sy^7x)px)lcgtpm#b1y z%EOt*{B@@|*i^OKmy=bOms%dtmV6D2lfqLU$-eV?QJE(yn(WoY$m(Y?k5A%{x=AkV z)s3c~y!cMyZ56TENl}NbYU&qTxkiWFRA!9bTB~ocO68T@O>*9`CahoUj(FD`n4fjq z5X)-3SBudxdm^>4d{TQzzeQ#OX&Qbba_1nrHOsn3WINJ;w{b2~sHF{MH_YarCv9OA z`6k}%Y!Ld95*fX=fs@P8VyC0tE-WDqPja}TXj|#)S0Am|`|(B5dJ8^^kycw*k^C+* zlcU7qBwtWeuc_Iqam*6!Ho|zmJlOa|d==x`+=;1aiP4d)jyHIk3K0*jmW!{UHOU0) z0)#lnK6n}&UmJKkP;?|U=;VD*>5%hk)JHt2nbR*Fk-o2d?(?;!o-nl#?bd{|11`Zq zEP}n!$uw)K9M5YqCd)2MR=Hh$r&g78(*D(ic+1Nc)_uYo0ws~1SA0+7;l0LtByvyA zT4QeD_^0#VwrZFAc649$;VV6bjG1jyqciw+Ez048)$=$u+ z)|JDz+zAI?znQvrn)se*C4ME|wNHWt?}Seu>N}WKNV+?~PS0Cv(Ymp^_LZ$eU0r=( z)oMA+^b)>2BrCiT8ZAv+){1`TgM!c3)>o1E@aOV5S=@HPMYsCugtQ=L{o^K zo?iC)dXHw*U4y5o3hC_~9YiNi*lsMO`_GaH?k*(??j;u#aPjgMtL7WaCQ6-BGMk@j zi;dTx{wx#wAb-elr_5m|ZLfT5A}le|7V+Rg&2(Z^+4JVmZyuykR%nA2x&7VU)mHh& zFRtPIc2;2=NL{V$9{nhXgpH!l7ecO*)L$)_qfs7t1oEELU(i;KrKZ?DhRdQ&sAY}C_7 z$%V=J@Q(+`PP9ZYs3ZHb$CKg4X4CV_c2^{nJ4$R;1st}Mg7$Vcm>C%(SajZ5uxeMm zfeXy4*-b{g;xO!fd~N65DRLN^j<`qupM~92c1(IQ2CCi?(Ot_o8Pa&R!95vHoQY9f}5*D9^r_-7pCUg|*68rkgraHFOw z8Ca74kgl4a5Fh{OUAG|t3DxZ%O8g4*mP+|HTjRmzW@gyMp>iaKV|uJlKdLKiAL1Yt zf4;wvje$X;DtGX%?Mteuw?7$?<7;sI`vH&Q6CNtSD<8Oo}SM!$RSt zZf2?7Mne)zX}aAhvb*j-Bb2cwmr*$qe{$^~B6J}|xBZ(k+TnQ=_uK8W?(-64^x-dEY>kMraf>Z|Yu&_YC+tM#Oc+&1f~4&1 zH^%(_7!H_a8a6ibhJc&4{_#)rXGb!r}LA^)A`a8~0lUu4= z@5iE3W4}F}n5viwA=gOGj>vU7a8xdL+_N=cGaadJ4&$7)=FzIadmolrzF$;5MIUKh zwMBB;veA>AGa)YS;dAw3tNBLea{Dn~v6&@wxzhoJV@o)U^rai4Abc}>d84)t(WQNcUBdB9RaC> zHv3WsmOjef3<9J(S(cuWael2sI(R7^bCR4REjRZrH@7n9Ak6>w&%$)Rsnk8>f{rD| zFh9SI7^`-cA8>5fKpsh35Ll*PQW()=opPz^c=;wY8O! zlER>n>sRj|(Zh7q5yDNiM)Gs^zZ8~{kx@|S79~~J-8m{01DR6D#e)UeQ}pAj8^m01 z8TRGB)Fqt9F&ee8PN( z6tCocD+FT3w3d=yMs;tdPTM^Rmy^G-8DJRPaWnM&A%^|^&;O++b#UCTtFOO`8xkQR zkucPJDja}!%i_dg}_;NXhS%TLi%th(+eqYYAJ z#mZTFLLzlE;y9;eZG-mb-HyN^#Lh5ROFzDjPm%6VtdI%}4nJ;kD|iT3SYsB;qP_%& zxCe5!W8J77KZOQib2KeX3C79P;+(iYP&7JP!`D}?4?e^|zG|s&^xloSUxRvhV0NB6 zXm1I=6MD?&gL2yZ;Wif@9V5Rwpy2WG1q61-^bgWpf2t4u!(3e`t`q>av%i zy>Dz?)}YgY!{6USE&FQLU&cAKaPs%rF|ALWb95KSFXHT4kB7%B^1Wy+F@& zwwW|pUZ40xIxV>!5E<{pec~siVE-mzpz60QN#fbu%=}R55qGNjMlpT)(nunC#58x6 zC^nEPj{4^*dUU@|sM9e}4XR&sMDL*wDHmGm>S^y0sBf>Ak7w2U9^i``+?>~A?o+h& z31@_P(~26;N;BnPWBT>w73zd} zVdbAdD(PO_yz9kZBYN6kC;Im|il7Bv{KRC@1imN|mH)#-QOt~L1yj`*8U6kJ@s}d5 z*HZCXFAYQP>C?1~iuptn@Z#+uCx7w%4oO!po(Uzp&otLr-=bc0Apitmi6}V_wWBPr zB6ps4_=gSMoiUwkY#wnP{}Hn4*tXhJzB|r5pIIa=({zUEy~3rXd})imagy;srrDbc>Xv!PRt;l@N#Q1#7| zo8+91d>1(<2}$DSAxGDlW>T}D|NEyv61+-JKRH>t&66qT$&6d@6m0^>tS_$yEC#ED zgd&c9qv-PEf)O9B@va@2*d2DxWdv{<5f&_HQ%~RGA@Aw|3C35akA%cqCvs))sj961 z&cENAN!&b?syk5WnlvpeHPZghJJuAqA3}$Q_LB;;q&n^Lo3@EhCVY`Nu-jM3Z1a88 zb-+eB*^O37(?7pGcQ*0PunE)9>(3^s*0&d^O^b?GT{+uPmjvt!DE1~xnY?RFn#KRh zc!Q)yk+%+Zs<07`A&U8Txas1h?hW`ipa(b{KcM3lb`uBpnhF)uZzK4WxeL3a)F}B! zBZTsVFDK3@)6&uD_0;obe7jk?|8kXW(P6>JhKo6mi@or+63c9l%-FR!X~K z$Yo%2`{J?ADGKA#Z_kvTU24Bd#e(|Qyj5wHc8Ac)Tvtl?-AUg=;orA^W+IKezcSIz z)gMGPHVCwvp$Az2YWn4%`{baH+;T;uc}CGXGv`NpIVAf&CH28bP zp8N`Jb~iEJxVl7-W5LIGEzBLiP%<<*4^V`(0f5w0Qu^fQXNG0A>*wEkD{MnfyCY80 z?!9*1LA({~TFLxzHGuZ4@)LXI>9h zt>vdN8PS_%^p*}%>K}XK|FomsY-NRKH`~pNXoa|J^+L}?7h_Xh6T;4szJBA7#3!F> zW_}40sLZ=FMdWKv^)h>np%4grukJAPOp;zWKva0zZhZM#tW%X!8{T>UorTe=g3j~i zeBEvyjV3@s0wm~Bx$+1>EK}$x4o@TVbKAWFb-gq?GGE2-et z%*ws|M+!j$vq7DUmV43P2hdiE9>|B42}FH#)k#%UZRj713uWa6xt|}qzFnWu+?p)5 zFzNnBh*jF}%;!Ux)i*Z!R|ed@F>fn>ph^`+u_YKC5Y(=L^>c_Ptnd4UR_v>}r1|%; z#g866axgCH+PuCw!6IF!v67%R7&?3KZg4uAVfBPZoMVl`?Y%usDxc~*!-Fyi|DrB$ zf#or~$Vevs#(-tF9qKZ}_EjB*p!(2QFTu~k!I3HBt#<2y$7j2PHa_8A(nGE(jl<9l6~LzFo^ZTq|R^9?f^n;Xlu$8=atcGtft zZI{rK_Y!a#BPTD!zD?G_`OqccLHx1lv6|$=-L!3`z`kyuSE}E^UgPm9Rd-1W7#?M72`qe_6SY z*|BIjL@zb&TnK6{VWFHdiTJMN7U^_Ih@Zq-0;G%3Fiov_&F3*#QcIcD#^lLxr)g@! zSGbEU6^mXr=GjEE zH9)ARS3gBa41Wm;9br^rQPmXNS{=(~qn+U4R3_a+%y6KXjd~Rxtk^1>I3H`Q;O3h( z6+Zbf*R%S}Tn&j8(G)k|n%V$%S8AJagZhByIzxU-E=iBdj{QVw>$v24#m@dtf(rBJ z;#2&z0~OrrN$MYCKa9B-32$N4A_X>QREx4qP5(+z%5Q+`$kVEH@ud;N&h@R1`AY{~ zqP*j~o-L35iQfBoU7U`(w92vuo^;r~`97Ty6Gdn8cDy-XWpS6+vD)0EE;Q?c#CoV| ztpKB88a1_7)Q0mQkNr$4V+$8s=9h=<_9~Xj4Ozq%*-f~feV_FCzFd-WpRJ5tJ+IwB zd6USi$JVH%d&z587Wc>ZN~!c|zuK)tQ722zB)_3IY_+Y8!cuNL9VkBvtX}7#&lanJ)@i`0Wm&7nwLxJnL*zN z-ck7(4~H{#GS$e4nu!ejSfzHdQS*?^o*jFH2@fjpBY^5G4CSPbZgVX`^}5?R0iDzA#u(e z$fU4k#f=?UKIK0&E%`N}@6`L;P-Tk*VVofe&rJ z)`^X)n~IC4>@&+0wQ3pgTI7Fr(>2mk*P)Ql6|;97-&UoHvX@zOEVS7|wl3;YzSrmv zr#7lRVXnm~M$j2>dNsiE@>2mBr!Gra0))4tzShT-9eK9XI_2rbEya%-n7Ji1)%sVzV(ff|E~ZjX zXQFZ}isl-oE2U{y+R()M4rI8cbwxWNLCEKsRhd_dWTi&)bb?C{?~EZ;*X+33xwMnl zcUOfA7srr^gITSf!s|l~R|yhqt*Cnbf+#hr6+F17*W=FA&y;QDKA6G0yTE=!zP<~s z|HZ`b%>u`o&&N|nhT*Xvu-U zVu&eunnKwnkSR$?K014of(P8zBsocBij*&?llJNAc6WEPv$O3M3iW~CY9YAB#sIF2C>GWg!XGplZ`6k?;us*%Z0b zARQF-MvR_;)4&(s7N=_os<0gInTd<{q-NU9rPB#h*<=^wY7YywY}#a&`O(sB(%ommBwnFCi7(IX}#}| zu*4|rb~Pg%4f^{xbhVx;76siu`Iz7G9|I5Aki$)ygj=!E3^;+OPoH{oWh6J9L_kd;+$Z(b%y*XD^jrL&>%S_E`{IZ{D&1Si zE!gXIVWNVaD|@m0U>_Lhf~gpfi_99kU5c6xOO=GNV&0KFmMLg5`PW`4rd`fhYNy@h z9!;lGL{|#1#3&%QYAIiZ?^nIgtNd_*fd|-6U}ar*UI$;AOs1c3x>BjQ?-g9_;}@#1 z=pM_XX*$o=s4z_syl3!mz;CcA z`COxqLn03ox_mQd=*E?{5LQ;!94X$(!|%^H;~y|O+OA8pvKw1HgFg6y0(O~Ebyk>b zCqF}xUrc~+R%6CAdb?R)!8k%EEZ=Xd(U#IBqHfJy%#c5P-ry$?3k?e;Ha{fG!pp4q zMe?eKq<$rDrp;Jpu(_l=tB-B*5@)c4S8%ze1Q}J^ED5J-x&CFNpXpJHv#jjs;mXOS z>B`BO=`O(~MY+9m$ZjXu7p3WO_ZG=bl6$7=q8ueN9bF|3xVVh|Z8D}VFWwd0(}&K2 zRhDun#q*7cA-(ONf@Ann*W)6i-(Yu!y5Z0h$x^9M6>fv}IE8c-U^Pk4pI=)TP^~r8 z(Yd-@YS57Y9j7N5d(j>ivoViJ>`uK?s@HgNzzmqK=1}&Xy+tPzqoo>hK?l``gH%)4 zr68dto0RV0M&r$#YNAQoprnhlo{J`K<}B3j{@H^5TBWWuASy(ZOkZYsRy|m1H;+k4 zNsx|Ws#VEDboF#~HUM!ylb%1gz0$}$*%E>I#ofPoVGlgL`0Ge+^ND}q=~EYDE;Q`>7L77ttP1i++Aag_eyQo2W=)P z4Rx#=wb`W~p#@Mj49EKbvz+omT$52f_)QlszROfuX8zS& z?`I6A9orNlxEB!1j+CGWYFZ-?5%_T_&R>cQ=-oVizBe`v8xo$Mc-+TVwV9miYRkKNWv z-G;FZpUEH}w}PHt{NQ%0)4puCJxC)n(?k1M&WJA&p72DzAtBs)4d+X18ZIYvmHXk8 zAQ$#e0uDt~??41n+l=}0AbH6>iWiDfzkFE&SxE(=m*N>Z z*WlHVLq0mLDtFttyjAc(jpOa+Q6cUH-o=uR7*P)*=8`AKx083Iw;Yozlc(>9v54jU zY{UzeN3#mJ1v^#HgSiH>5J}Q}%hiCQb8~ZJy#=0(QhQh8l4cAkf3~^fBCkfs(?yZLld~e<@0lCBh-*M>a^_vANje&DX6YlCjx%5<`2(qj6i{QPappx&UXv9)o_3DTtnhJ3Xgx)3!uPz+gAa4*ygD~ zl3*D#yz|fTY1%o4Isboh;<>byU?%ljVPyyVcI(k;X+{uR-I8`23tdPv;<|NIz?ew&p3=GAy8O0Wj#sfv`(;Z?|7E|A~K~+QO<+^?SaZ{=O(8Ie;1P|hn6(%n7 zWsJy1*AE{)%+1Z6BIl?MN6|}#_eS5tw|Ti(x}gD5-AXiw=N*aCLq(Q`;^GZ1M~UQe zaC%=tLQ5pSDwQ|2U|Dpu7Ni>aIAr-T1v9*}r*fRn7?3Z8X$3Am#sD(iSO9gziyP?# zsW5vT22$W)cNK;~RM{Lrs>Gb*c%Y)0x%s-rM!&hVfx$HB@?%*?mYbR$zn}gOE^6`^ z1DaZWUEK|4W^YEMM}lP7{(7cUbA5esT3T9)@lcv_4v4e+BOc5Or#j2MA4^MTItd{V z2nZ3m(HA6cU!Q#O!}odddyySUwbwyk1aa~f6BFDdE}BffM_1lV43CLSabmh@NM*lt zFYkHH$IJEg^^HM{JKL{0hwNpycc)^#pK(zT3s;I03&s3iqY%HKVZ4%S6Bg zr;JOMACxA54dB+}*+hQZwePBdY%N?m6|WDmP!PL){%8DrUirZ)PW-ycNJ|7wu=}pT zt?>po-icqsNq&o(DRvC+#_yR+vM>1PhadeX@H#nmUJt)2nfjR!FnY($JxeUll(MTt zCv+N*_bjx@Fj%)8`g1NKf5mWPD(S-S!*Tf|PjxHL&Z6^#hQ*)X3qz;xqWO6cN11v4 zR%_bDhHzx{pD(X`!$h6XThup`kR z^l~#YB4Kr+2-xdvEHxP}mU7^*c<|tXTCCND4fXpYf8UO8Ll5n@ z6B80rj)VsV1w}ASF~pmR%VVstuNaE9bD>aSeg0zYrrm;mv8 zm=h6{1KH{N@9cE-R(VX!NWXcj=jzrT?U3mbVc_(n5;1QCd|l{l@%3~(N?7wxaQd(iZ+g=!Ti{cwO{mjeEh z#v-eE6*;*8@SYTyjymHL8iQ}>)w2s*S6$NcH7;`(6EPKNjW+}qagM$x7Zo_$D0SeV zK33i33M>zpzf?Kr2Z|N*-^YDTI)aE9!`sBmarT|hepC2hu*iLojPZ#qap}sC%_Q9K z%ts1tIO%Dm@le^`H&V^rfkj6}y+@W<2jcI2EoGlmW{MZf7;fCS1YIl;;J{yq8Qdhy z=D4%Kz({u^AJHY=o?==04D*er1d>^Qe?I^(6AVf+GDEZ6vCiiz5LMX=86uYMTC?eH zgMbeJrmN(>_{{N^-;@#MJ0;13Y$T7X_or9oRECCtS;tL=d(97jm;|!dza-W7sFedK z;mL%W4(oxoS6ECpmwp@=YX5j_#Bud-KUgnrgvq&ZvM%tNPc%WN5Xhi-{U=tcDoSq1 z^02f9XA+6kMGhItYrVFZK;W&=hlOSnZq+i`T0=v2()9P;%?A2v4dk0>?rmB0 zp6hu={(dm714WSqWYMdBQ@6qM+Gv4=g3&nIG3U8`@HWn_e?A&>lN(Q<#z;%I__lV2 zZ$48@{sW@UfI5bQ!pTU(_PBbx#Zu1aO_z?_+_GfUEK{@X&C+p0usLk60Wk<|6trc~ zeka=pnV3S^Qr@v3;7SD)tM0JgW%k4X*Qa?4?)MgT6=uGf04H8wj(+3l@@Os4DRY2@ zop`yd+ML_1E?yO}gK1t5tZ!}(Bn12y6lpp7oj#+Q?`-L#M5N6V85!S*h*D_ylG?FA ze|0BFlHdHOobx=wtl?%Dr%89%{bM3(W_Y`veHC?9%2jGKCh8(TTOMCUN9eZ2K3=*? z;>C|u+G{>Es*kyPHq4W);&QzV*y|F?`_i~JN+%=j#3dx?#ueqAF7tq|ZKV3Wtzn=J zDL=HCOt1?DMSTO{s)hL**iG8J8bglb^bLd(5@x|V(Q2@I^gn-xwg-Q716v}|~0t~dx z`3U-iJpif%5=I;?c!|(JEI1QV^?uP7mS5M;2PVh{d~WHdjCNW+u?Rn%hU8QxFx<>J z6hJ`juqN|GJ?(31Qc{v^VhfEoU$(=JmCdc%((xeGIKomB`NwX@P=i)_x_jW<#kutq zL|=}`yK$T?tq($di@xXj!NbF~)T)ITD5kVB$BsUV|_1odM!`{Am)3=w=NyDN|G_zzyyvx}>!RfPdu0h9x#dz{d=YGJLGZ&8ewYRrJ z=Ylg~&ZE1qk|dZi^&*Suwph13XRgtYYy>ASMMu5!DmkkW?++nySsyScv({cV#M5-J+CI96D7Pnp!rU3X|119>|vJB^6yg+2)wKJy`XAaQ* z!NHt{-M4o*2<5rFJHb$Mey9>hoTo>{{8^lSGQ*~Rmq>2;e9OF^8|8Y@{Ge1S6W1B zICAd}=A9qDR`t9IG%bAIQ?8*g0$s*E84>eejmV*!Ig?+GYX|vaND$S~tJQdt>+k;C zDfl=ltqPs33ncSf+BK!QYytvTa*q6hGF(7&#_3*Z=%3U|y9a3a=JZG^ZM z>5}OVIdtQ#G}{$8!sPEq!gWl4-{*hvqZd`{ag-?su57mia$kggK4=|+s}QWQ>5SjN zO3eoLU#()Lp2_iX^_P`L85A>e*MD*kY`{HWw#OTT4`vk0Qxr2J=Tz0y`jcf7do=9Q zZ*49aU1U=0#ktSZZgU$$OQ~r)O{a?A)e4c3)B|*=u&sX}bj^8pccZj~<*#uoe|BTk z$%%B&^IS-QNjrM$hT1&Bg%l0TnRFkvI2*3!~!x(SfYG`QzZezK^86Q?b3~zF_ zn*QJH%hUTTYCc@Yj}-2m3;zesIGrQ(xQ)YsM6FP5x&>H30n45sUb4xm-aH%C0m zcLo+yTu54R(8QmD?OC<^K=G@_tGcAq-@6~IcR&IF%2F}iSLwR6yc|!#ytKoX{q!>lmY)6tjyk(QHl1BS(y4Q#)Y;QE~H zPA`7mOom~)nxWJiOP;Aa)zgUbu%x|k;R5UMKhTcG;0#D`jfKThm=)ufD`WNDfNjJq z?~Tx&9>Yq%{3n=cI?N(UedT#pU^vU^ONt8ewZXAoJTqXR2h02^vQF@FrwkYOb~7t| zxk5+x4Xp)seE^scJONhIcYayC98v7BKG z_ap`Piwa*%fR=DqRb-kc3ylhAUrUylHx;nMX2y9`4^2|~NEudUr{}P5&Pf$4mhGe& zGNmev_tN!VAhNR<4LrGL+h>*K6=$RYian4piLGRDeD;ypAR;1DX6h0r@c zi57Mv=2>@K?^4VT-lpie*_)L{yHVH6^J-zYfg#ffom*d47&@a5q#L;Wai)4mQAS3;(h<+|FXbC~@gcB{Z?ae>G`Ifm;{z2du)-w92&X?3T+T z-&U-FDTh@D1k#Bt4~?j>Fa{DbPUGABQ~1e)&s!rIyQVagr)+#oa+js&S|{ea~>Cdtamy@f^Lz$;z}am6Nn=w^TvUvhbc%azU2Ml z!uC`P1I~OiACnoDj&*69U;jnz86EE^n!LpHF#L#1|Nilof8Z~7;jeryRm zqv8M%j1|=_1NpdMajuEItF&sH1w_T11yspHhyBEd6^x9Gfq0-U)Xy{Z z4!Vf7RZ&dwHp2mbWknuA46%a@;UG~-+(B-X-n)29fP#)l9RKivRgBspcbx%MX_b{8e9UZjxpv5U)Kk8zyy;4a0pxH^>ZOS= z6LFn&1_P7wJ&^n|_9guwYeFT6{Ve>k3lQ&gAc)RD;}%;@rIjgx7Y?y?GpeF2rrYBo^Vyb~)m+v; zdFhT2zax}uJM5hD)2G+kME2!|GBQp$-cE%EQPZrREZEdBie_Q4dsEP_3QivIzN`E7w&J*!cH^t z(#*V4WG$@!N9ie%5&DToi?4h}LUQRZFum#+M)yg`2P0Vd&jy5rsQSFa>rXOfuNRvm zcohfn*QPu4_jk9j$jW~~IX=fUprM1-V{B~9Uy8>71Xf@B&gMUu42N}uT&!W|4A>%| zjRMpk2COAE*7z^HhXY4v-A?qIY3l3iN14`KhN!b}_bw{@1NVlrzu>St?9RKCv>!E% ztA}OHl>!d5v>3}{<}xLgT_x-)SDrh+Y^yE9fBE7D_Z8D5CnnfFK+g#vkdcD)1ep&@=3|D{@`*-bm*^;YX}EK&bUyug4e z^NCA|Vt}sb?^m<=4x||H3uq1lToE=Os_U?FkFC=HLu|##CBx&aw-aiEyffczK(RgUvPZ-($E zkCF7$326ISaPb9mgL=sCxVzcZ)Fc_k!Oh9t_bh9UPFiql?A(ABELy-U-xHU@3 zP^z^vBfgnN#^92dUpQBp+R4ZUjaV+tKmk8NJjP-1a z4M;LghkwL)I}i?kf5V7-G|-45tViC9QJ7XArw@-7_#q`JiQ9lX=WuB0%zh0Eu8Sn) z*zSFWM=Uu;$LX}c3)^bP#>auC;p5~Ct~j+x?lg*1b6Y+5w(;1nq5V3jE$Qj$6XWAc zA&a93@OCS0c48Y$|0c2Am2=w&xkOlk!?%-)lakz>n2v8gb;k(${=5qJHeMEYwcqFg z-SJKNUW_0M?!Ua%Q}`kt|1a9n|1WxAW~w%QD4^Lout&e7Qbi0@Q-RTw9*Io38m`57$ zR?7engj3rw5*x1Qv)(}e;{R^mN6t7Hov{I1%gviNYb2$z;^%L5$TT$m+<0m}DK)E6 zMBN!=4IMo7@UP~d)O$+jzsxaDRAI&7*}wip325-ecz-}a9S1sWB^tsW$k<$DyK(V6 z$7GprA|yrM(p$G~W#{B@8ubdH1?;PVK-k2~FaIZ{emcimgqqUoAJpQZ9LtVMyIpU_ zi{*gvoM)tyEnT5$sS5>M&r%g@0YoF@>$v%^Vthblki7gwNO*{?Wr@xJB-MZZ+!&gl z!utA)9(v3++t8s;5x~}6!|&0~#+R`-{?fPUk<{1!{c#uxC2IKhH%D=d(&TmeNw@E? zgBi!w0wtE35^D~G0wD=in(70yfP1b4pi}yzNX{(-X(CYZ3l6}v*IrIed>jJIP7ZkD z@*W+8qh53*cp1lZs|@Cf7f{-3k* z%DpWyJKGE(%*+nC5G`>Qj#K}|`ILN$ZN-?BJ7D|tp-ux?-cxq!7}EsAfXVL|i18GF zngMMhun>NduuEG6DZ+pTdH%|8nn{$(VbF1BKBt9;ft_7mp&<(TFcD<+l@&PV$?s#{ zdJ1fRoddJ1P~O^_MGVKYi>R?VUc8?i7%uNrJ&1z%7Fu`fyM-WnKL8nJNd46So%gu( z^qX2fuU%6mdAze{|9#Gd3UbwzmAQecgO>tyWol~fc|j2wod@?`@6O?v+P}nJNGHhI zpw-FNMX*U28yf@1C@U*_yg%v8-=eRLZz59EsWSqScu>%T;hL*v-IrchSN|0H`IynU z>B-(jTct>fnA7Y8S3dtz^;TJjnjI23l#5u~srVe{^Y^IAkXi;^c2- zpU*qj6D{ib$BQ)Si;^k+^P?DJT-F%f7;-XE&3Uz`v3?~{#nEve6eieOj2IA7fbH3d z(b2;JvQn2>b?eFx_7)E;Rggeov>Ua@J+k$j5!cnzn~r?DE`-Z9jQo2&zxA`7iSh9~ zqrMf`Uz~DcFmaFptvw}?1w<88%!?N;=;`ajHfw9}vZ$hr+9KqXnIdeTC@7#{oBHf^ z47;2Fa9>>$f4Hv3uKl3)(VhK-KmO;9?WIm zBX&1Oz5SkmPC&;ko!Pl|HBDMrtO&Rlsb~G}XJ~+iXN+iM!ZBWX&gs&06WVfea$^${ zUR3=PiC;j0Zs2f;RzR;3XMt-NJH*VM1^Hn$SPm(KDl1%bH}Z zN2ZW=VgjKk@UrS(jN!UPES=nIdy8BM?Ns5O_Hb48mU4=goTD8keAc( zAY4EE3fDh9(Iw1_2=4k%=W(y?fVv$J7B8F;0GnW<@(BRXA`(}4N6`c`p}mwNHq z1OZKQ2DBFDlPw@4G(d+j7e?uDE9;aFtkRW=ZJAPEFhCsx+QR|d+EbF1?O3qphVPXF zi0LMJp+k-s<3Cbt+~SO@{WG!42Rr2lv!J(tl~n>LS$?|)`2oOL)y4)^@JQrg^2*{> zMV9cQfgUyUW}HCxpFKv<`PI}ec;CabZgifZXEAi=+)55BjI`5dQoyYDQ>d+5p2!eW3*U}Pn z!>Hul2)xZCm{M?a7+-k{GN7^@I2L7|KJ~No3`8c$tZS7R*O1EC!S*(2)>0^%QAT~& z+@=z4B@WwPCuKl)yw zyA`!qI7#(L4)!RdrtG)hfBt-;`u(|dPuFj1hGD1SVN$`Zh9ilK+Cxw}RPWZ9NpP+% zWpZBbzr{PG0mce3<8PpPP$Qkdj(MUp^?7D^c7mc8x?&t`1*QWM$oRxWgF>MN>iLX= zyW{E=#_<#ah6^AnuDnZhI@kvbc4VGj?ti>E26CqpEuQUhdw_qO9XN`H^L6J(w}10L z@`U@^&tON{9{y8VSxlaxK9b`0gbL;j2O!5inWAU2tEb)C!0HV{(1Y%+|AgvEQ}*}u zmC?}1uqC!aK$}nu+E%(DNW?mOBgLM`B>A?D=&4y4Y1Y|_xRcOxMM9~>@!cKygSHZs zE!}fN2mASaKYarG`;FG2MX)}$202Q+{%uvPz5oc&3(Fsf4n=vlZ$XTz#8i9*4QKrB z&e|T&!-;vI&EwwgQnt>kQ**N3+^_w&(uds+UbG;o`9$9IFFer`hu=IAxEm&~634qr?0uEg%sd!Y7zYgtg_kc^~H7(>Sdz z%vpk|Fb>`)!pmC>F}Z@R!1A9^jbb4Yj>@F9oQ{LmvZe!?RPY#TFa-?upa)U7ML6~> zCDK)0m<9ST7$J#gK>?7jC&8+KR#oEau#(s1e^X%WXWK=3p9*Hf=9Z26JH}GLKKzgv zx8dQ03hIofgP|+r0Nzj5by{@ipV_JN#GdrzmFMP%}p0xPeniYx2lTY6@~OBW1sn?mfsges(dm!ln~MI@ zP0unQ4QFDF9Zkr~&d01cTSx!$PQu7s*w^%1ivJQw(s}#W?*x2@_LJ^E^H=_l2kiek z57@sNZ2u^zbjbGcHnuHKHblaGHKKTrFU96hVc;f}rg z2*ZBGwB>xH(7h_0NKbd~x$6t*)jQ%CX9VnI$u;4c6SYeaQj_udNw+@o>AQmNphfn) ze$jf~o#DjUpLFhVR&o)$(71WB)0mJC@SeD?vSv|GhhKqdAFRJtR#@=Ra6q*yeWdXg zXFG=mlI(F9hh!!-_-j~dDf}V%IRym=gUgDOQlL{WKhv`blr^xwyT--QPHV$r9?gbsJFuhlWg*Vl9=Ini;gO)N;=P{T-ndoHK7#y|_+@#E?c zSP#}MYTK#LiSXhmZ>QbZkI+O3r8_NuBONzzBc>e71Eby>DGY43d6OnM8Ey{vkJd>= zGwpO3F~dv)rsu(RetvaqpvQIQelJSixiD9crEzx!ck|;Y4WcZQ7p6R<tl|yAbhDQYQ-2AGYSeGw7|xrVHcvYWbsuZQl@}fDB+!AowV%x zJ3|Mc{szZa!aMph6e2;L06qsmI}Us2nSxvv53ihaxb6)YP}Zg&Q2v*&G%D~j0w;P4 zUH}KB$SX#HfHxMf70G4Ru{s*>04)4J> zi?=1SO`Vwpjya(AEN9nG^oUGXKASh&l}hh~=6nM5Ih7v;`E3aLUza3< zMW+|6o`9PN!^~0zDo`PD??odK*o@w8C548`Gi?`VAgMklT^F^YG$@xc4eU@Yc8gr@gO^s%m@JMp3ab0YyLrr356UK|xYLT3V$fHb`tb3={*2O)05_ zG)Qea3|cxjn-J+uN=kq4LXUBN=l<>&kkDyaUfU*S2#DWsW{x z?riTWoSLqX%hbBJwd$FTxf%4xAe#krwEe4r3(T{+}0@bO%7W+vwek956a&~K%| zv`GwlR}Wn=iqsy!h>Zch9I0& z0ST0SwmWtmR>M+ZKvAhAF0A55;s5ZmJDS0(V`HZoe-?dTKlw0B9F|6B9 zk{rE{)<66H9Un|5Fsm$v-X^i78%4+3#XAqi(~t;CX|Ej)z@jRJZr&$u+# zjd5!{T92UUGR`UGaFV<*mYpnUW3d4@tn`Cj7 zPMe6h+MCp)hhGMmgw&nua*c@AJvU;|FqW_#2zGyMWel<*G{qci8xX0GE;cpitO>%;7K<*@BEl+6f{br- zy0;lnhiy$JvF=vsMzz5N4dS!D8iGSSW&TpsOoBr>AJsH;jn+7$R=+}c?}GqUR3x-e zy2H8D<${`;+TqHPGyCfcWLZfD$WS%#axjg|jEsJ-Yvd$)?vEtivA<~-Pg4j>9_ff< zXJZS#1$Lj&T?RZMw+C9|wInI6T|*gvjp^ui@aYY{DywykhRs1;BGWo)8zZge0gHIk zKwlMH5<2<)o>=#qb7PdF2SwY`MEKrAEfb0swL-ys7+Wy#yeeR`8B8sd*gz!{ZAvYD zF|lA_12zMoCFfv%Dwn%X{f-@bsZD`nl#5doLXUSXSDVN%QO1xp4WfFw}c1)&&% z3G_EtLNwo#uc0Y7|ATuM!YimIvCdCF1rDQKXxAyMYLD~6M-m#>S5_Qz6d1ZeS`x8+ z)n+#Y>xhi;)qZ8Fl+xJKJa=B=R<2`8X`H^B@g;We@Td z`54#m8ue7|;|h-gNr|NQoS_k+gM@W!1ZA)Xb{z00jXG>Y6zG?-3)@1E-*x{{l~==V zej-_Ebz;0J21R^HeDH(G&kI#!@4cd(?dQ6D@W&7t;>8*dEzg|zdA&^3>D!N8zj^x+ zf1mp2aJ+}OB}7~$tF~RcoO!ZSA;5xi_sRdcjsJe55$Y+i0kfAa@AG{Cy2B$QAt51A zw)Ok~+fpX<3+xiJqox~SvEb69hKGj*_VM9c(Xa^QWMvfu#$uraij?CBqhHFO#Z3WM zj9!M8kC5PCsLpAap`mb@lvIPOhY~-!8g!jCkzUl!($h*t3Vi)LicNrnYb#7)oWZ#73VgO!-913w61V>^aZOOlXO30Q8JDw>bh^9+TSO zH85cS&rMUe1Q9vus%^XPZp~@#n#x3rwgR<&L+NFryMcUbRURO0pr-|U(;5JqLu0VF zfvHAf)cS-;8%fsni1>nhm74>8NiLtuw#kfokdP)Wow@a7afzB9Y zYix>$n%e2W1z>o40*7(_WT-C{?j{`&cPTk;NdV2?_L{xq+hsk^t01g_v1<+q4BYn` zpV)9vbdYF=_}1b)IW(Y(HS0;b!x`&JBqrM_xd9DL3DnZ}lc}XQE`ooFl`J1UGrk?v z!Q4pO`E}(xGKNy%2BN0c1`-v}M-#N5uxQm3T@F>SdFq~WAQtE5=71FIflL*8c@iU% zJ^`5?$CDEe|C5tRt%)B4t)~)UDetoASi3$N7~*e%$tP4-314f1Scd$Z9~xW-2MFg^ z=}N`7C~b)DGjD~b=d;$#+BueLeBif4boy+{nN6T`1&3c44899wQh}N|mJsTypw&2i zky41uIR3Uwyoh0I1eb||lT*GsbE1c}_1A~wdYy2WFeuS0H(0B)3hl;hzP$S+_9vO)pUHWGDOlG9~d!K;OlCO%VbT>W7H z?GQ1Ma`dAACS(=xQjM2qha7sH;s^bi>2xw~J_T@aej6TMjb|%iQcNuSMtQiObDHfR{^V-tU`r zgg$XdEC~-73)-Rl!%{u&x#uX@TqLs)Vk!&`9=9V?C=!Pa&%J+tyHg|d%$aJE>%s0@ z#M1t!iPb7Hi_r5> zIjntP;KMKJA@Odm808R25F#8y9^+PNuI?oBu&cnG&t+f^FHq>mT>ujBS9z zw?bb9_+~UrN`&}USAWy{_F`2T(qJRn z%nF|7eIPbVL_=snBs)Hti5jbZ#D^^YgaFlkv)hQ6lvb-Yp;`+3fGfD$r(Ms8hGqwW zF|ZIh`rMbZa87kZ>Bron5^|gYv+cp|qjY$^LVFZYI*_%hkrO(|z@6Og<0a6v3V~yO zc#Z^6|3C-KD;SW0U?C4`6D4E4a^61Kw~zV;qmtthZ}^Wr-?|^q5|Yyi4(m{ft%oKq z&9n{xNecl{YZ4y9a>7dg;XU6xz6|#(1Ya9`2SF3j+2+ha>c+;%*w`nNi71q(OYjl# z&QF8w2;xa;gX!>*MX3CS@}ije?Xqu8#T!(3GqJO4=n8@R0mhdN;7`i~7&msWSR)hG zmtCPe=5{I-=V4kwu%3o|4pbdgE%1OkP%LfsAt*d)@@G4W`jU}_!g&CnqGwyjGwTR- zV?-vmAKu~Q98$LcHEhy#NSN9xbqBrMa#ahvIAOwE|ECGlDOs{&CxMpVmEwS?x*m{_ zS^^Y}?U_wqnYUedXQ<@il06DS*|fNQc>xM;jHSb?h;;_?-g?j-W7Bxvr&nsRaIyf~ zfRgU~cn8=fT_Ow3sK$^Ar{_m3K^+6RbJR#k^he|WFk(G+ zZN-6j5d^LffWAE3M;=-k{Wlop`{65aP$ou3NO=#0xRBMP)@k?r4LMoApznufEPpXG zSP$;*?%lZsd;SDl12bcu+Q*I^g9>!HV{+JUFv@RHRd&a>R|yHXL0LYmN6sa=%~M?3 z(gSb$$4+opl)jZ^BcG|O;`v>H>u+z|qi=^0!|bBo$Agr!l9#Y>#mLJxt9S&8NxQ^~ zNS}`|1LcshkrB9hRDSE`r6nm-+4^C?f2O{zBzx!+!SV^~`FyU`+nF0O=QSksjV}+Gz z5UBXa7l{!-D)ex0F*gFhqu-*m+h+uC#`|?|Y(dm!>O@imPR<;|;QQ=D0fBbWE!;yu z>mN^rVA4My13|w3=Qq>FIv5PrF<#(9Inev^I|Ay1rbAd1A2pTd32o!ha^kICo?i+z zamb;-{()EP1)p_vpwsAUFYk30^%Ou<`;hgDuC1+YfCeul8x~lZ+5e239RQCB2-Vup#BRiFc4E=x{M4zL$XP65bm)YOJ7DxIu*$hqxRM_ZB)0_IAA!ZrXGaDV~jB{i^_Pyn_o zH>(`FMk++2;x%W?a%59;7GTlRg1k8<82lXO=oh!=apRO$1(B#j5z!3*JjoX=64u8DrnnU zp&@?oVI}POLk}wf&)qo1Bhc)1#3jSbL!_s!Mtbkwz0^*FhhL7t<_LhG6~-0H-Y3;= zg=ch{i2pP8(~GYQ=WoIJi1bGyW5y??tf|Q~2XDFyDz!snAatis-v;Wr_^{^GF$=uy z1vH-(_KcF{=G}~6lmLTx4GGaVI_3CQl7y^+hv6fN&J7W5JUAIRdj?vz4;GsM#{qqL zvgmo{iVYy+jEs#1_Cc%VMNv@?s3c%^r)lNLPKTt(HSd#pXC*OSYYJi;Wl1AKQ-b|D zg>dKzW!%DV&8GCSyH24Jw7RQLdJi_ZRlOJhnD=P^i7z6A327SHiSi`q9>3^<^nt+f zF!jRZ9SQboPwXp%wA)Q$3eN2e@zzW;0Q3lWRLbX6qPcvONHN?GCY2z(;_0H-*s0Wi zN(Sl)(GL^e)K*e>k4z*PL|)YPXUz2|>s0s?I;|Z}R3Q+zYW7^NpJONzL#NG$P%O29Drr1Kr#KB(O#b>a9S0bu=-qFP|HpR_4gb6WXvb zML7+>gbMddFY^R@0QR7f$O6fDs(xt+a2SZD5uSd6Uo}22fQOA6hi0D$95c3ey-7oqH0U+QBo zr{_{vM5hA53=~kceguP17cvwp35TPbMrS#8{qIBwr(upr!5jebYu_qGgGoS=_U5b4 ztHP(f`f6%tP4zW3UpgBo`m4SHNQn{C=y0{T$iN^~yi8c`#R?8sQ$N3?6~Iv_dME|& zf7K3v0&KlO`b6^^ccM=lZFLjzOG$(+st~zLMLb8^?nZPXTv0Wo2_mgJV(7 z()tH#Y~#_-KYao*-V+hN4Jr@i>u&2fIJQUU+O=1u0frDZkRmF*vHh29XxxR;910l- zo@pIDXrY36dZC67uUX={42X4JfsWV*dgUq%g`F0MgknQ6N7<;JQ*cCsmS!q_HbEqt zZs1xpTkzzvoin5cL&}H@aMip-+W>lKG36y7o}OZEs=q#w)vx(!-3}rs$hQcdm3gl+ zV%|GtgLw(isA+{$T^R;a=(@rt#9uW#ra%RG(}^FPvW`EoStaqFFY5_wjWfh$7Fb&jJYJN zX~N;wiVL~apfsBgN={h%h<>SJ3FTrxC=%%R?D&AI*%YA*NZ`|BB|1{o|=< z+w4@4-D&cHk&G4JTjEwI;g8IR1Q+Qx9~PriL9V)?kQ)SKR40f2K+#iAr!4UN6b;nJ z2a06eJs|HY-!P_7{C9C2u-1;=?+DrJ044TL|K+*sc7I2C?{C1Q(A3lfI0~IIYpsbY z=5y)}zXMG`Xm|bmJPV=M0%Hqv4*T})g(>ZxfB7Ntv)%qDq27fcVei}m@!!DgjAl3F zhd1CdvsOw8k4xIHLP zQ*#-6J6j2c1HD>Q1%Q^kzWgAQMAbIh*UG2`84U2dDhm8VP&2Y4+dTqAD?5U3AKGS! z?>%fIMj@S)+S_bj@)Gs0fBT#`jTf2BZt=dDb)aA8fW^oaz`@0L*zBcgFCW~Eg)OXY z)=K7)EtCz&5%~K)zmxVM!pQPz5aXTv0g=hU6QruAdxty`h%4Qd%d4T{(dGJqR+m_ zV81r>4EI07u9eNm#nm$Br`?k|X_l@BX1l%6_zXaj-+auThys&wven~XW{xNFn$OY= zhC9sw(g2FEH_JqEiB=I^ixqb97b^S#4YGnQN$%2~NWQdgBFO#+4?iQtM=lt9jq|cX z92P8~K*>1!3iQ_iAh-{j0$&wVXgQfRNl`5QeQPa(Y~2q%Ct=fK#OSZe#}@6e zv3ul}*D+bisxiadq$C2E`>?aHs90SPB&E_Cpp?`q0ztWSU14iM8KqSbtqY=v)mr5I z&ecGE_n-Xe38n>5ird)O0H_@l88nV9SC)$`fs>^Q$^d0Rq<$k;F=+&Cub`s?GSPu| zUm5Gaed7A62WKl0ZDM-<@X00Gi%VgRCJ|_L$a5eD>gWatfW*@jyebL|QO;ofa1|)P zrt|;yMSj?y56MX{>@5VS;zlSV?a9!X14@1+ulWwsX8`C0lAI0k&`rDyC7-TXnWIeI zpme6R%)1G=vB1zDQU?yNo`V52^n_I1~;H zL_z32%t2(DP@jBBE9QU2f82_}uh~4n;xrqx_hYVx2ic>FGY9Dej6T$~% zHw}=WLNvXUL=WW04zYiti!lBx6il-a^*Fh>gh}(;Sn+9#1S5#mu)!jlB_xa`Vt}PN zM6|UL|17+I4?oh9gn>^FfFl)f{Wb%N_5xC;ByH>@?%5y?akYUXO~Z5S1f_!vJx|>w z+Py^u{Vf)9D$@jYk&%;wHCWXH2&h)wc};w=J)lvUD#&TT8qA;hMT(1Ibv^#=qm2IF zM8OW4e>=dEvcf>JLW>n_&iSPIu+_9;;-Lp8jqL&y{Gp3$3}fx0`IASEs5|oz_C2EQ zr?=>^zhTH~X*X}7>o(m6ASVhnPqU`6u`S)>)~;!?Fx}@dH(b}olV}T-EQH&aYkw00 zXJ^7|3_x`p{p}VJ&Pxu)T_F(^_)Q=}2dXAPd}TcQ3i#zxsR?IJg6Z}em<6JMcs*v> zmeh9OVmBBCi|BGnvad7(I}s;WsuK2@MH|TkH2EdotU`3Q;{Q~M93BQ;^ zw1OL=eFN<}m~X==sAWRCBs500*!Z7(9=>%1Iwq(@TpiurOHS3))tzm7#EOT{9Qg_2 zio4=PKttmQ@RXAK_Gv+&rJ>X(oufpOL&{I|`p8dK?^)OiU*9M78Z$q$7|Sn@!Zo*v z@p&S&;7>Wl5AMX0prWI5ely9cQ3Vbwa9e|xg-M&sbtCiMj#Jl6R=)=FK zIA4tLh~d5f+6?Xn(fxt=Vq(Gq2PG{{C8e9#ot*|5JAW3k{T9C%;|m6%rwl-@I#@5k zzB4;(bHtK<$1~O+rFew=)L6C9Zn8p~7#f23MtF51OLAM;Q^5)%PnEx_>ZT36`1V%q zp0xt{gDTz>#D|#ws>sI{3z*>dddMB|VzTt!w)@Fnh56>*o5uLEn`fW}@8?H_Gf}Z* z9J_v0`nL#H6kX0^j$hS#Q(p_p#4Fyvip|n4hInb#Tl;^N@4M*ml4geuen|kDsd2o@ z&nSM?@BJ35u>M*fDSmrGDeUvs-);q^1?6GY?kp4E48;GRaLN5SWGGN?ng*7jW2d3X z&6_u6WU8Uu#0@$mL#^X0;7 zL)bfpOd29#8v^eFoy0b9d`?PYHWB0$)NK}4P#Xp(qDB{R%3#tJRD3340CfL&U#SP6 ze?2`t*oUFqnFH!H-Ha~lM{UFn@A4YTpl>v_W^K~SLl8iCYYNyIECDy_-ZFowAlUj= zTT@r|HC@|-&~3rQdhGadXc!+uw4sZ8Nfp)0XJd3EMr8Z~a6s}xeUz%J%;O4-jq=a2 z`L)&wyhIL>hOu`EjYyj!_!pwbn#&Vxpv4fxJ^N`yiXfAvah zl5HExdBR=7y>V(C1rMP~Mz$Q*sDOhd9$U9;4E=)ky|xX)&2J260Cqz~b`4JY6@CUM z8XG`E(QK&H)Adm)QJeaUU01k$kaM2lz13s1JS`}helDV4Jmzal;yVmtkxZYVb4>)4 zSo5xrI>EMKqz1KdREC zoK4h&j#5w&o-3AenB-SbGluiMp{)zvV;|V%0FqsXsxd{p(N=HavQG(vu1LiVA(LD< z{Mlg@AuA(Pcqy`y-S%-N{aMWJou=+Y;O9d7Hw4x}xAVA{=-O+O4Df}j%?F`oVQi1G z1!!9%%af?co1E;R7yzA8xDzJf{pS<^-Q3;|bGw`escI|-(7%dQOEMQ(NbX%G!#sl0 z^$e8j{VJh03T&1V%}k?rY$ML!2D}^vYR5S_1k|QVH{F@ez07b_tw$7*8-YVujJ*~?O!)Cf1jQ7;A=V%!%H<)0O7tK9|u3wlU% zyRC14^{rH`>)#9B;ORrB<~%?86#|f|6#rxwkWk@aVcL_-SO^AVmrtrH!gG$-$Md)y zj$pX7$PG@KU~y?1+n!x^I#{Ywoi(v3sXITG z7%NM1@Ki$DGWTWZ5(AzB-F0pc~;<{_+vg7bD^@Qm+P~Q!#f2aAk8H%0Yi!$Y0`xjfqtcO zP_a&ezzmXygb2Dv5dJAIO2kz%^ZQ^q$nte zBhKdRhVcIMukilcR@$@ct!YaK?#Y}BGkv)Q)F*Q^-o!ah(R{C!tGdlB9sIL6{_uHh zW7eeyCMS9ljgQ%iK+^nIA-#j6BGLQ_*oOgD7>kfJ?*2RPC}`bnUAYd_rR~%SUW*rV zb6#3-P&)9H)q4& zlsv9b63Kn;{By(l?TI2t?);9cG;e&zRoas^?%X5p)tYds!6all+^8;9x9}w-HcH4h zrz?_%ih7g;cIcbNYbV%ZC#PDoUaXG62@qf*p$1PjmXhPTY_srWcY{UY--tw)>c5CY zp{z-QILXn;{X($)Lw*lnuX7{R>ex&0$uZn)646(h6v$}HvAp@C(C%GYFpS#xQD~oa zg!SM2YDM+Qx6cnqp_{Qe2#Cc|m%i0VLOtU-2ni0*yOFG47-+kSoJLSt__#g>Q>SlT zejM`HjspV!;ldTV`wJM#K>ZnNOqO~5kDySZR;a8dKdI3dssp$N8Vuo}2L%uF%veq6 z!4$}rT!8AEGYF>$@gOo;k=z#t+eg7$rHU+-nCsaVE`Xjm<=fES*3Jq#zBoSSJcKksw&J{|4W!5*EJ6j}xuB4u97Z;n(+)48 z4>&upRe;%Do6Nqxe6-rRjpXuF$*QFj{Oo>ht?}OCRXBbprjYAt^@RIuKvY%j9wr=Q z`J!w6q-|f>qPh0RmLUO*zts%(sFVM&N97TBf@lErBqM7TdrnjN|Bjj-apNQ5&;anJ zfZ8be`Rg~RiJK4nj);u&GAChEL42_wX}4iyVDM6&_)eM@Oej2M#f+l-tDr_>mb4Fny8U01{t4k@t|oaPcs;`_Hz3v>h)xIkQ4>GWv9QRwUE(|>%~ZN@i1()mfjAO1UI`sAr+6){10)0d z00t#8d53TO`LPce6w6BLl(+Z(BbGaY1ZVHXp7~2NdLqq2Tg3_;5)|}x9J4!;!k?5L z6an86Xq}(&7IM9J?BeXbkH5Y`0L3T$|0q6xf$;y)zy6OJ7-rtYLYohim51VSKnhME%K37}8h5bMxuaMs)WLe%EkNaM-g z6zCi|&kl*yHQ1dY2L^x)Snz|c7}zqpE*1769d%R(PS;hT?fOhDE_EF#?NV4sr$NON2?u*3T_p(b+OBN{%+_Q^CAErF>XF;Y@7qXf zOCfuQcF{2as|e}Crdt5ASbIn(r?vxV5P&XGNHlG4Q%WX<`?u>!Yhu^I zVqV4^@^CKF*2kx0CtX1i1$lfo9AgFG5I`YezANjk-+VD(N66WMaQp_|9B!bz&e1>H zf_U+q1r355f)&?BM3>IbK#x(iij&i;TDoG1>+$zX_^sA%(7i~-&g|HA|2d`TiLj{g z2TdB`K1ca7!T;gn?Zz8W4+d+oi@s_a8mg+&`oPyMXFuv%hAa$ez(mg0gt8@at^y=* z6c0VXOj3HgFx(=L@kNjggN7o%{}E*?tpk?zjY33Mk&~^%HkpqeYXdZL!PDox=idt) z|HgVxPDNPif;Osu&;A{h7u`8|MLWC#jqp(076wB*K~U65@Huv^v}=^D z$guiI1RG1z8kCdKPIUN4L5DPdlpGy$HYvP%Lr(ydQE>QKmQeHVan;Ycp6v1qWbZ6; z9x}jk=>AsSxu!#-9F7u{e{tbb^Jsd>N>Ufgz2HjFr-`mK`69=fg5C>MQYz$k$lbxo z#;5_0E|in!tK_ z3%WL^HPGhD>I1#kCWSN|)kXsScwKnCZ*#q`>fL_4t|MfFpi@SQ_q_vy3UAu1Wb^<_ zH|+&8rO^!9NeS)vH=Ahd23z;*t$EyZTv=~ptyibw!5%{iE#0$B%Dx<5s4mOP6A8!E zj%cJQxNHPTKmTwd-i%*)?%@lkhgVR7k=%pi9m1Jw!Vc9dMOQHS@OVx4HT9*GuBp0q zIT2Iq6xBE}F8Xpb+>QEL6NWL_v|AfIkzTS;7JYn5YY(pbgYCfz+Z&20E7BEnt)jfn zP)b3bT|1jnzi+$0XIg)~cFI9*sz-J&gxgWSE%w_@(X`@^q{$HPV!4CsFf(LIRv*x; ziBTcPH1g@aKU;@rvBn zoyTrLY6#h;7YSJc+K02D9~LW)VUxoLd<3ejLixk%_Bl{Y;-lVhIJK1 zZD)@*$f#T6!^u6?lEcy?ZE^(&%UmUk_z4FQ`)Q$Y`RDOP%lRYW6$~U0Xp89F9 zuRtxuJ-fN6$lwUBkhKrGB2((C+GWB;c{uwCLOrX{y?ZyF*$<3sztT(X$BHMd+bGqh z1|L|-|2}c<(E)kT0s?IJ_j?!&!LioJhzcln@UCtH)*O8gT2~NTo|s{e3vH1k)Q)0{ z5P`$txII$g`D-7)jvaQmX$=E{tU3@eKp7HpfJT}k^=iA=VKog9BmkLr{z+bzxvp3c z|Ch&fY;e}zh|7pH`{8u7EawrNM}wSI9%*7&qs(L=rQ^&{Y2Ybg*jD^eCFt^xOa(<+ zI_~H`y4f>&K6;y#FEM1f{3UK5Qc~8Uqmg|ne&6igl4)OeWtgUd47pO%w)CaGe3(7e z-{Oo+U(Y`_CfBjf*+{;ZeABo25EKdncmwTZkq;`;hjv$N-+k44iOt2<+DkWD?#zI z)4J?yx#~mjpmy8XKW&J3;qIKnuk7#8_Sf_`~ktG;WA~C*A!z$D6 zHq|dE&uRn{o`;>{Fr0tUS$DFn&3Hdkmkq7jEpKK^-}+r1i}=2vi=xWG@0#C8>8xy4 zjJJpXwLPq#I^o9{Io?X6uXlz$?vd^)O9T14jvlAdRt)*jY_rZL%?dxczLu(%{kkyM zbgItET$ojWcYlrcnzkxE<=YlNG-9`}jI$ZksQBI=ksd-n%jv z;9IinZm%!}0O@u%|L07Wy-%OQ3ieH*EcGyp+}LcpUDs|b-4wjf>5ze{wM*-Pjp-J4 z*Y&yeP|Cp!Z_VKIBhvH3BP%!NkH;H`O6{VT%|^@WovlTM2ZVTB&ZS+_uE!VM3O2kl?aw1U>aD!d&;&h^ig{vX%q^U$OtK03*ic*O_fTk|R zgrBOGn}3}g->rL1=Zl5DdUWK-qRO~ju3jS>=oJt7!A8p&j2 ziI{M`)z&fXEpSoTzsp-aQ($4f3qKtcf0X8BOqA@jVoBEPdINi_e$CM6omq1NHKh#p zqH4`LOSB_z(%-NdxZe2CsTnptRJ7CV#IC7+{?+Fk7cxE~G>k;`oA7-hi*jonZ|W-JDnET)2A2s%(;p-S6A@_KWFA@@buLE zI$p3Oe1t#myt6_qZwyaC*m6aoU|5yj#TS=%ouN+8KFf# z5r#1vc-cyb$jR5M*DjmeTkxTb>R!FO!G3QG%KpPoYzCwXcg~-rc1fk?niSF8+sfYO zusn6b(eMTgWR8rqsVA0kv2To0%0(G+dOHLy&LY~A&btVi?6jrizPOTG;4-jZcf2sG)BDfCl~F+? zTzXC_8miOxgiF4NJFq&`PPs>D({m&Hmqh;8n4ay<2YidwYwK8;#@bY-f;GxtzC5t7 zDKW+yV}#$DUk%&qg(G7!C#@F=zG<5SpKQH+7#W$TnpRK!u^!3ru-h#|A%yf4-?jJ- zDeQ7^c;g0L`nRv?mej(__WTQG0hO5}Mg1XY(K!pIn7v@yJqq?R?w{|G!0AXvywA&? zNa)9hQ`cVT%xhEI{<`l2wa8+Jf2jARb^SFS zk8d%ShK-6+$>Ouyb@dYU(Re$zs(gODM(GKr^o<4gL`xnalU)OPv90M@;kIAnjyEwV zuQr|R;g4!}g7Btn75v8VnZzFBCA1yQQ+pnkqV0Mbts~t8=lms!eGf=BN|dJrop6aP z2MdRHt*h`?l&NkF;Ex!$RJ1eP+;JjD3(G}9I@X@NR7J@U%wwL$sbLb#jhAfR)7}fp z#dw|>(;h3IMY-eghyc%6hG>+%-sbpJk-pw3xeeAoEQG}SWX#8}Zbzu$3*KYe|{X8OtD zUBb>$Ewe8StTtL&mRPT|5eMWoXB;!QK}amrAK6MYuM~b=U_FF7kp4Jdy>=1*QqkC$ z*8+!)NZBtLM!>GD%~MCR%yZJ&}=5wun1a4p^n5=@{+Sp z($~C0ylJy;s<#BEu564l_@38}*{9>$mRBL~b7$jtG32}xCZ&F>yjjEJ4esu9sDigH zlX*7HG_eImWYdlW(@dc&2hWiK(jJ8wUybpP2yn4U7r{tM9Nf@%y;7&anIkgg`AAa} zm+w?*PlztOlRMp=u9dbv6Q0vLAYB)tJ4|+ry5)6NihljvA=H`UIn=3Hf&->K6%)N@ z67@n|kAB^2yfpUI9!A%Wq-Zs~V*_UF$KAwFaeOR$HSg zw`v@++Y>@0^ANsVV^dUyy?Ygxf^B7!cTZ|~r$d_iThcAwWrzoN5KM1F$qeRpskSp; z7`zv`)#hh7j%NL0t@t-WbGiB(8}(xzx~>3mtHy1d?ukrv>E}Po&_prmgu1Gy-_PH$ z`aOZ3ufl4i>AVaIT8N;Tw~b2KVcA?Vf5z=)4_zI!eamJ}8VJ}0(+hHC-ON%)(YLji zzId-b!m1`0ut`w6(6PCN^am;wkyYzQjazJdExzyRQ}fMaKQunpZS2YlXQ5Q6LB!s* z;H0=}kH2#l4=h$8_5M`bu({#aKgAU^Bk$~A5-VkUNZJI+zLhh%%3Xy;PRt(5U43a%sHpz_ zA`A?My6)2H2p)4Bp?>*UcSsm31)it0GzOTM?~K}_b^-v!#RxrDytmd*SXbI?rZjo|A`i zh0*t$%zAhMZqh2%wJ1bLo`heSO?l!z=_rs_Qk457w)~J^&U= z7#O;!?(U-9_s6tMMYDr}Ci}dVfa4g}W1tpNBd;EEEi=JLlC%*--3|%U$?|CDfTNc65;S>Pz+f=hF z1g^M^h{%s|ED$AU>c>9W3h*I9t3b|wuu-LYxerzfS&o8M%g7p&g; zhL~wEs+QNbT6EXOU`_Y^%Q#JEi7aC2Vx_uWEu+g|I*k}GC=y+mN(Lz&CgU~93rS)$b7kwjL3j;O6go1_FrSzI&miUz= zkJrP_jCZT2av33p09J)NkK=`>JHn`&g(?OV@j=FSeYx4Xlz(Vq&d1CpJhq8BinrL4!?_tNNl@5iY61(>qJDS?^R(*ao-12%n}00k|8N%sp_QI>vu5ESnvE-FON9Di#qdg=Ga%27PgqTmM-| zE#5^i(hQ$N$<{(NyJf#0KGUiO(eoDg+;iR?P$2M5=I@;H&aV&4{{A7{S@_5uie@G} z8Ti{->S%@fzg+GqA@&fQtB&8uXo?W-un8z=zMoB(DihY6i93OO+_CvQo($o-DxXto zTvw%kz$6&$RC+i>-=pDE*XH)Pz`$8$IfCpyjENk~Rvf%5qC1_?^Zb6jOqSFWV)$e$45jeRxUZ?XeE51e1z%aymGlxe+2!o&;dhOuL^4+tB+@S5xc|QZ11+u@ literal 67742 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

gBR@Nf?M>X=Fi;vkeL6pS4(3oL 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

|x!QL2 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 xFXaZBDY~9Z{FnT>X)M`r^ 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 diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 97e7f44e924..3d7633df67e 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -17,20 +17,22 @@ The goal of the Storage Monitoring Daemon (storagemond) is to provide meaningful We are intrested in the following characteristics that describe various aspects of the SSD: -### **2.1 Priority 0 Attributes** +### **2.1 Dynamic Attributes** -**The following are dynamic fields, offering up-to-date information that describes the current state of the SSD** +**The following attributes are pdated frequently and describe the current state of the SSD** - - File System IO Reads - - File System IO Writes - - Disk IO Reads - - Disk IO Writes - - Reserved Blocks Count - - Temperature +- File System IO Reads +- File System IO Writes +- Disk IO Reads +- Disk IO Writes +- Reserved Blocks Count +- Temperature +- Firmware +- Health **Filesystem IO Reads/Writes** - Parsed from the `/proc/diskstats` file, these values correspond to the number of reads and writes successfully carried out in the partition hosting the SONiC OS. These values would reset upon reboot. -**Disk IO Reads/Writes** - SSDs use wear-leveling algorithms to distribute write and erase cycles evenly across the NAND cells to extend their lifespan. However, write amplification can occur when data is written, rewritten, and erased in a way that creates additional write operations, which can slow down performance. This information accounts for wear-leveling and is persistent across reboots and powercycles. +**Disk IO Reads/Writes** - These fields account for write-amplification and wear-leveling algorithms, and are persistent across reboots and powercycles. **Reserved Blocks Count** - Reserved blocks in a Solid State Drive (SSD) serve several critical purposes to enhance the drive's performance, reliability, and longevity. These reserved blocks are managed by the drive's firmware, and their specific allocation and management may vary between SSD manufacturers. The primary purposes of reserved blocks in an SSD are: @@ -39,28 +41,26 @@ We are intrested in the following characteristics that describe various aspects - **Over-Provisioning:** Over-provisioning helps maintain consistent performance and extends the lifespan of the SSD by providing additional resources for wear leveling and bad block management. - **Garbage collection:** When files are deleted or modified, the old data needs to be erased and marked as available for new data. Reserved blocks can help facilitate this process by providing a temporary location to move valid data from blocks that need to be erased. -**Temperature** - Extreme temperatures can affect SSD performance. Excessive heat can lead to throttling to prevent damage, while extreme cold can slow down data access. +- **Temperature** - Extreme temperatures can affect SSD performance. Excessive heat can lead to throttling to prevent damage, while extreme cold can slow down data access. +- **Firmware, Health** - These fields are self-explanatory +### **2.2 Static Attributes** -### **2.2 Priority 1 Attributes** +**These attributes provide informational context about the Storage disk** -**These are a combination of static (S) and dynamic (D) fields, offering secondary information that provides additional context about the SSD** - - - Vendor Model (S) - - Serial Number (S) - - Firmware (S) - - Health (D) +- Vendor Model +- Serial Number These fields are self-explanatory. ### **2.3 `storagemond` Daemon Flow** -1. `storagemond` would be started by the `pmon` docker container -2. The daemon would gather the static info once init-ed, by leveraging the `SsdUtil` class and update the StateDB -3. It would parse the priority 0 attributes by leveraging `SsdUtil` class and update the StateDB every hour. +1. The "storagemond" process will be initiated by the "pmon" Docker container. +2. Upon initialization, the daemon will gather static information utilizing S.M.A.R.T capabilities through instantiated class objects such as SsdUtil and EmmcUtil. This information will be subsequently updated in the StateDB. +3. The daemon will parse dynamic attributes also utilizing S.M.A.R.T capabilities via the corresponding class member functions, and update the StateDB on an hourly basis. -**NOTE:** The design requires a concurrent PR wherein SsdUtil class is enhanced to gather IO Read/Write stats and Reserved Blocks information as detailed in section [2.4.1 below](#241-ssdbase-api-additions). +**NOTE:** The design requires a concurrent PR wherein EmmcUtil, SsdUtil classes are enhanced to gather Disk and FS IO Read/Write stats and Reserved Blocks information as detailed in section [2.4.1 below](#241-ssdbase-api-additions). This is detailed in the sequence diagram below: @@ -68,16 +68,17 @@ This is detailed in the sequence diagram below: ### **2.4 Data Collection Logic** -The SONiC OS already contains logic to parse information about SSDs from several vendors by way of the `SsdUtil` class. We leverage this to gather the following information: +The SONiC OS currently includes logic for parsing storage disk information from various vendors through the `EmmcUtil` and `SsdUtil` classes, facilitated by base class definitions provided by `SsdBase`. We utilize this framework to collect the following details: + +- Static Information: Vendor Model, Serial Number +- Dynamic Information: Firmware, Temperature, Health -- Priority 0: Temperature -- Priority 1: All aforementioned attributes +This section will therefore only go into detail about data collection of attributes mentioned in [section 2.1](#21-dynamic-attributes). -This section will therefore only go into detail about data collection of attributes mentioned in [section 2.1](#21-priority-0-attributes). #### **2.4.1 SsdBase API additions** -In order to collect IO reads/writes and number of reserved blocks, we would need to add the following member methods to the `SsdBase` class in [ssd_base.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_base.py) and provide a generic implementation in [ssd_generic.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_generic.py): +In order to parse Disk IO reads/writes and Number of Reserved Blocks, we would need to add the following member methods to the `SsdBase` class in [ssd_base.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_base.py) and provide a generic implementation in [ssd_generic.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_generic.py) READ NOTE: ``` @@ -111,11 +112,14 @@ Returns: ``` +**NOTE:** Augmentation of the EmmcUtil class for these attributes is reserved for future iterations of the daemon.
+ #### **2.4.2 Support for Multiple Storage Disks** -The `ssdutil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. It could also be a different type of storage device such as eMMC, USB or NVMe. +The `SsdUtil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. +Additionally, there could also be a different type of storage device such as eMMC, USB or NVMe upon which the SONiC OS is mounted. -In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()` which will accompany the storagemond daemon at `sonic-platform-daemons/sonic-storagemond/scripts/storagemond`. This new class provides the following methods: +In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()`. This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, within the file named `storage_devices.py`. This new class provides the following methods: ``` class StorageDevices(): @@ -226,16 +230,26 @@ We then leverage the following proposed StateDB schema to store and stream infor #### **2.4.3 Support for common implementations** -Specific data, such as File System Input/Output (FS IO) Reads/Writes, can be uniformly collected regardless of the storage disk type, as it is extracted from files generated by the Linux Kernel. To streamline the process of gathering this information, we propose the implementation of a new parent class, denoted as `StorageCommon()`, from which classes such as SsdUtil, EmmcUtil, USBUtil, and NVMUtil would inherit. This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, within the file named `storage_common.py`. The `StorageCommon()` class will have the following methods: +Specific data, such as Filesystem Input/Output (FS IO) Reads/Writes, can be uniformly collected regardless of the storage disk type, as it is extracted from files generated by the Linux Kernel. To streamline the process of gathering this information, we propose the implementation of a new parent class `StorageCommon()`, from which classes such as SsdUtil, EmmcUtil, USBUtil, and NVMUtil would inherit in addition to `SsdBase` (to be renamed `StorageBase`). This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, in `storage_common.py`. The `StorageCommon()` class will have the following functions: ``` -def __set_host_partition(self, diskdev): +def _parse_fsstats_file(self): """ - internal function to fetch SONiC partition + Function to parse a file containing the previous latest FS IO Reads/Writes values from a file (more on this in the subsequent section) and saves it to member variables + + Args: None + Returns: None + + """ + +def _update_fsstats_file(self, value, attr): + """ + Function to update the latest FS IO Reads/Writes (fs_reads/writes + corresponding value parsed from /proc/diskstats) to the disk's fsstats file + + Args: value, 'R' or 'W' to indicate which field to update in the file + Returns: - The partition containing `/host` mount, or 'N/A' if not found - Args: N/A """ @@ -262,65 +276,43 @@ def get_fs_io_writes(self): """ ``` -**__set_host_partition() Logic** +These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to retrieve the total number of disk reads and writes, respectively, by parsing the `/proc/diskstats` file. They utilize similar logic, differing only in the column index used to extract the relevant information. -This Python function, `__set_host_partition`, is designed to fetch the SONiC (Software for Open Networking in the Cloud) partition containing the `/host` mount. The function utilizes different logic depending on whether the `psutil` module is available. +**Accounting for reboots and uninended powercycles** -Here's the logic of the function: +The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: -1. **Check for `psutil` Module**: - - The function first checks if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. - - If `psutil` is available: - - It iterates over each disk partition obtained from `psutil.disk_partitions()`. - - For each partition, it checks if the mount point is `/host`. - - If a partition with `/host` mount point is found, it returns the base name of the device associated with that partition using `os.path.basename(p.device)`. - - If no partition with `/host` mount point is found, it returns `None`. - -2. **Fallback to Parsing Mounts File**: - - If `psutil` is not available: - - It reads the contents of a file specified by the `MOUNTS_FILE` attribute (presumably a file containing mount point information). - - It then iterates over each line in the file. - - For each line, it checks if `/host` is present and if `diskdev` is present. - - If both conditions are met, it returns the base name of the mount point using `os.path.basename(mt.split()[0])`. - - If no matching line is found, it returns `None`. +1. Introduction of a bind-mounted directory within the pmon container at `/host/storagemon/` which maps to `/host/pmon/storagemon/` on the host: + - This directory hosts a file named `fs-stats-<>`, where the latest filesystem Reads/Writes values for that disk are logged by the relevant functions within the `StorageCommon()` class each time they are invoked. + - Upon invocation, these functions extract the initial fs_reads and fs_writes values from the corresponding file, parse the corresponding FS IO reads and writes from the `/proc/diskstats` file, aggregate these values, update the file, and return the updated values to the caller. +2. Implementation of a script, tentatively named `parse-fs-stats.py`, to be invoked by SONiC's reboot utility: + - This script would live in [sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/scripts) and would be called by the reboot script + - This script will be responsible for parsing and storing the most recent FS IO reads and writes from the `/proc/diskstats` file, particularly in planned reboot scenarios. + - These values would be stored in the `/host/pmon/storagemon/fs-stats-<>` file(s). -**get_fs_io_reads() Logic** +**Logic for StorageCommon() fs_io_read and fs_io_write functions:** -1. **Determine Search Term**: - - The function first sets the `searchterm` variable to either `self.partition` or `self.diskdev`, depending on whether `self.partition` is `None`. This is done to ensure flexibility in searching for the desired partition or disk. +1. **Check for `psutil` Module**: + - The functions first check if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. -2. **Check for `psutil` Module**: - - The function checks if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. +2. **Use `psutil` Module (if available)**: - If `psutil` is available: - - It retrieves disk I/O counters, specifying `searchterm` as the disk to get the counters for. - - It then returns the read count for the specified disk partition. + - The functions retrieve disk I/O counters, specifying the disk for which to get the counters. + - They then get the read or write count for the specified disk using `read_count` or `write_count` respectively. -3. **Fallback to Parsing diskstats File**: +3. **Fallback to Parsing Disk Stats File**: - If `psutil` is not available: - - It reads the contents of the `/proc/diskstats` file. - - It then iterates over each line in the file. - - For each line, it checks if `searchterm` is present. - - If `searchterm` is found in the line, it returns the value in the fourth column of that line, which represents the total number of reads. - - If no line contains `searchterm`, it returns 'N/A' to indicate that the information could not be found. - -**get_fs_io_writes() Logic** -1. **Determine Search Term**: - - The function first sets the `searchterm` variable to either `self.partition` or `self.diskdev`, depending on whether `self.partition` is `None`. This is done to ensure flexibility in searching for the desired partition or disk. - -2. **Check for `psutil` Module**: - - The function checks if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. - - If `psutil` is available: - - It retrieves disk I/O counters, specifying `searchterm` as the disk to get the counters for. - - It then returns the write count for the specified disk partition. + - The functions open the `/proc/diskstats` file + - They read the contents of the file and iterate over each line. + - For each line, they check if the name of the storage disk is present. + - If the name of the storage disk is found in the line, they return the value at the appropriate zero-based index (3 for reads, 7 for writes). + - If no line contains the name of the storage disk, they save the respective values as 0. + +4. **Combine the previous Reads/Writes with the new values**: + - Then they add the new reads and writes to the fs_reads/fs_writes variables, respectively, to get the latest count + - These values are written to the `fs-stats-<>` and returned to the caller -3. **Fallback to Parsing diskstats File**: - - If `psutil` is not available: - - It reads the contents of the `/proc/diskstats` file. - - It then iterates over each line in the file. - - For each line, it checks if `searchterm` is present. - - If `searchterm` is found in the line, it returns the value in the eighth column of that line, which represents the total number of writes. - - If no line contains `searchterm`, it returns 'N/A' to indicate that the information could not be found. #### **2.4.4 storagemond Class Diagram** @@ -335,20 +327,19 @@ key = STORAGE_INFO| ; This key is for information ab ; field = value -temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Priority 0, Dynamic) -fs_io_reads = STRING ; Describes the total number of reads completed successfully on the SONiC partition (Priority 0, Dynamic) -fs_io_writes = STRING ; Describes the total number of writes completed on the SONiC partition (Priority 0, Dynamic) -disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Priority 0, Dynamic) -disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Priority 0, Dynamic) -reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Priority 0, Dynamic) -device_model = STRING ; Describes the Vendor information of the SSD (Priority 1, Static) -serial = STRING ; Describes the Serial number of the SSD (Priority 1, Static) -firmware = STRING ; Describes the Firmware version of the SSD (Priority 1, Static) -health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Priority 1, Dynamic) +device_model = STRING ; Describes the Vendor information of the SSD (Static) +serial = STRING ; Describes the Serial number of the SSD (Static) +temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Dynamic) +fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) +fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) +disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Dynamic) +disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Dynamic) +reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Dynamic) +firmware = STRING ; Describes the Firmware version of the SSD (Dynamic) +health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Dynamic) ``` -NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by 512B.
-NOTE: For fs_io_reads/writes, if the SONiC OS is not on any partition on the disk, this would correspond to total number of I/O RW done on the *disk* +NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by 512B.
Example: For an SSD with name 'sda', the STATE_DB entry would be: @@ -385,10 +376,9 @@ root@str2-7050cx3-acs-01:/# redis-cli -n 6 ## Future Work -1. Enhanced support for eMMC +1. Full support for eMMC 2. Support for USB and NVMe storage disks 3. Refactor `ssdutil` [in sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/ssdutil) to cover all storage types, including changing the name of the utility to 'storageutil' -4. Rename `sonic_ssd` and its constituent scripts (`ssd_generic.py`, `ssd_emmc.py`) to encompass all storage types


[Back to top](#1-overview) From 82bd91b4d0116f52e8a9fb78632e88f2bae5805f Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Tue, 27 Feb 2024 07:30:59 +0000 Subject: [PATCH 12/26] Cleaned up grammar, other minor revisions --- doc/storagemond/storagemond-hld.md | 81 ++++++++++++++---------------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 3d7633df67e..9e8f64154fd 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -9,17 +9,17 @@ This document is intended to provide a high-level design for a Storage monitoring daemon. -Solid-State Drives (SSDs) are storage devices that use NAND-flash technology to store data. They offer the end user significant benefits compared to HDDs, some of which include reliability, reduced size, increased energy efficiency and improved IO speeds which translates to faster boot times, quicker computational capabilities and an improved system responsiveness overall. Like all devices, however, they experience performance degradation over time on account of a variety of factors such as overall disk writes, bad-blocks management, lack of free space, sub-optimal operational temperature and good-old wear-and-tear which speaks to the overall health of the SSD. +Solid-State storage devices that use NAND-flash technology to store data offer the end user significant benefits compared to HDDs. Some advantages are reliability, reduced size, increased energy efficiency and improved IO speeds which translates to faster boot times, quicker computational capabilities and an improved system responsiveness overall. Like all devices, however, they experience performance degradation over time on account of a variety of factors such as overall disk writes, bad-blocks management, lack of free space, sub-optimal operational temperature and good-old wear-and-tear which speaks to the overall health of the disk. -The goal of the Storage Monitoring Daemon (storagemond) is to provide meaningful metrics for the aforementioned issues and enable streaming telemetry for these attributes so that the required preventative measures are triggered in the eventuality of performance degradation. +The goal of the Storage Monitoring Daemon (storagemond) is to provide meaningful metrics for the aforementioned issues and enable streaming telemetry for these attributes so that preventative measures may be triggered in the eventuality of performance degradation. ## 2. Data Collection -We are intrested in the following characteristics that describe various aspects of the SSD: +We are intrested in the following characteristics that describe various aspects of the disk: ### **2.1 Dynamic Attributes** -**The following attributes are pdated frequently and describe the current state of the SSD** +**The following attributes are updated frequently and describe the current state of the disk** - File System IO Reads - File System IO Writes @@ -30,26 +30,25 @@ We are intrested in the following characteristics that describe various aspects - Firmware - Health -**Filesystem IO Reads/Writes** - Parsed from the `/proc/diskstats` file, these values correspond to the number of reads and writes successfully carried out in the partition hosting the SONiC OS. These values would reset upon reboot. +**Filesystem IO Reads/Writes** - Parsed from the `/proc/diskstats` file, these values correspond to the number of reads and writes successfully carried out in the disk. These values would reset upon reboot. **Disk IO Reads/Writes** - These fields account for write-amplification and wear-leveling algorithms, and are persistent across reboots and powercycles. -**Reserved Blocks Count** - Reserved blocks in a Solid State Drive (SSD) serve several critical purposes to enhance the drive's performance, reliability, and longevity. These reserved blocks are managed by the drive's firmware, and their specific allocation and management may vary between SSD manufacturers. The primary purposes of reserved blocks in an SSD are: +**Reserved Blocks Count** - Reserved blocks are managed by the drive's firmware, and their specific allocation and management may vary between disk manufacturers. The primary purposes of reserved blocks in a disk are: - **Bad-block replacement:** When the firmware detects a bad block, it can map it to a reserved block and continue using the drive without data loss. - **Wear Leveling:** Reserved blocks are used to replace or relocate data from cells that have been heavily used, ensuring that all cells are used evenly. -- **Over-Provisioning:** Over-provisioning helps maintain consistent performance and extends the lifespan of the SSD by providing additional resources for wear leveling and bad block management. +- **Over-Provisioning:** Over-provisioning helps maintain consistent performance and extends the lifespan of the disk by providing additional resources for wear leveling and bad block management. - **Garbage collection:** When files are deleted or modified, the old data needs to be erased and marked as available for new data. Reserved blocks can help facilitate this process by providing a temporary location to move valid data from blocks that need to be erased. -- **Temperature** - Extreme temperatures can affect SSD performance. Excessive heat can lead to throttling to prevent damage, while extreme cold can slow down data access. -- **Firmware, Health** - These fields are self-explanatory +- **Temperature, Firmware, Health** - These fields are self-explanatory ### **2.2 Static Attributes** **These attributes provide informational context about the Storage disk** -- Vendor Model -- Serial Number +- **Vendor Model** +- **Serial Number** These fields are self-explanatory. @@ -70,15 +69,15 @@ This is detailed in the sequence diagram below: The SONiC OS currently includes logic for parsing storage disk information from various vendors through the `EmmcUtil` and `SsdUtil` classes, facilitated by base class definitions provided by `SsdBase`. We utilize this framework to collect the following details: -- Static Information: Vendor Model, Serial Number -- Dynamic Information: Firmware, Temperature, Health +- **Static Information**: Vendor Model, Serial Number +- **Dynamic Information**: Firmware, Temperature, Health -This section will therefore only go into detail about data collection of attributes mentioned in [section 2.1](#21-dynamic-attributes). +The following section will therefore only go into detail about data collection of attributes mentioned in [section 2.1](#21-dynamic-attributes). #### **2.4.1 SsdBase API additions** -In order to parse Disk IO reads/writes and Number of Reserved Blocks, we would need to add the following member methods to the `SsdBase` class in [ssd_base.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_base.py) and provide a generic implementation in [ssd_generic.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_generic.py) READ NOTE: +In order to parse Disk IO reads/writes and Number of Reserved Blocks, we would need to add the following member methods to the `SsdBase` class in [ssd_base.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_base.py) and provide a generic implementation in [ssd_generic.py](https://github.com/sonic-net/sonic-platform-common/blob/master/sonic_platform_base/sonic_ssd/ssd_generic.py): ``` @@ -86,7 +85,7 @@ class SsdBase(object): ... -def get_io_reads(self): +def get_disk_io_reads(self): """ Retrieves the total number of Input/Output (I/O) reads done on an SSD @@ -94,7 +93,7 @@ Returns: An integer value of the total number of I/O reads """ -def get_io_writes(self): +def get_disk_io_writes(self): """ Retrieves the total number of Input/Output (I/O) writes done on an SSD @@ -112,14 +111,9 @@ Returns: ``` -**NOTE:** Augmentation of the EmmcUtil class for these attributes is reserved for future iterations of the daemon.
- #### **2.4.2 Support for Multiple Storage Disks** -The `SsdUtil` utility assumes that the disk drive is `/dev/sda` whereas the drive letter could be any label based on the number of SSDs. -Additionally, there could also be a different type of storage device such as eMMC, USB or NVMe upon which the SONiC OS is mounted. - -In order to get a clear picture of the number and type of disks present on a device, we introduce a new class `StorageDevices()`. This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, within the file named `storage_devices.py`. This new class provides the following methods: +In order to get a clear picture of the number of disks and type of each disk present on a device, we introduce a new class `StorageDevices()`. This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, within the file named `storage_devices.py`. This new class provides the following methods: ``` class StorageDevices(): @@ -226,7 +220,7 @@ We then leverage the following proposed StateDB schema to store and stream infor **Limited support** -- Support unavailable for Dynamic fields mentioned in [section 2.1](#21-priority-0-attributes)
**Not currently supported** -- Class currently unimplemented, no object created. No monitoring currently available.
-`UsbUtil` and `NVMeUtil` classes are not yet available. `EmmcUtil` class does not currently have IO reads, IO writes and Reserved Blocks support. +UsbUtil and NVMeUtil classes are not yet available. EmmcUtil class does not currently support disk IO reads, disk IO writes and Reserved Blocks. #### **2.4.3 Support for common implementations** @@ -255,10 +249,10 @@ def _update_fsstats_file(self, value, attr): def get_fs_io_reads(self): """ - Function to get the total number of reads on the 'SONiC' partition by parsing the /proc/diskstats file + Function to get the total number of reads on each disk by parsing the /proc/diskstats file Returns: - The total number of partition reads OR disk reads if storage device does not host the SONiC OS + The total number of FSIO reads Args: N/A @@ -266,18 +260,15 @@ def get_fs_io_reads(self): def get_fs_io_writes(self): """ - Function to get the total number of writes on the 'SONiC' partition by parsing the /proc/diskstats file + Function to get the total number of writes on each disk by parsing the /proc/diskstats file Returns: - The total number of partition writes OR disk writes if storage device does not host the SONiC OS + The total number of FSIO writes Args: N/A """ ``` - -These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to retrieve the total number of disk reads and writes, respectively, by parsing the `/proc/diskstats` file. They utilize similar logic, differing only in the column index used to extract the relevant information. - **Accounting for reboots and uninended powercycles** The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: @@ -291,7 +282,10 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese - This script will be responsible for parsing and storing the most recent FS IO reads and writes from the `/proc/diskstats` file, particularly in planned reboot scenarios. - These values would be stored in the `/host/pmon/storagemon/fs-stats-<>` file(s). -**Logic for StorageCommon() fs_io_read and fs_io_write functions:** + +**Logic for StorageCommon() get_fs_io_reads and get_fs_io_writes functions:** + +These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to retrieve the total number of disk reads and writes, respectively, by parsing the `/proc/diskstats` file. They utilize similar logic, differing only in the column index used to extract the relevant information. 1. **Check for `psutil` Module**: - The functions first check if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. @@ -314,7 +308,6 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese - These values are written to the `fs-stats-<>` and returned to the caller - #### **2.4.4 storagemond Class Diagram** ![image.png](images/StoragemonDaemonClassDiagram.png) @@ -327,19 +320,19 @@ key = STORAGE_INFO| ; This key is for information ab ; field = value -device_model = STRING ; Describes the Vendor information of the SSD (Static) -serial = STRING ; Describes the Serial number of the SSD (Static) -temperature_celsius = STRING ; Describes the operating temperature of the SSD in Celsius (Dynamic) -fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) -fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) -disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Dynamic) -disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Dynamic) -reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Dynamic) -firmware = STRING ; Describes the Firmware version of the SSD (Dynamic) -health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Dynamic) +device_model = STRING ; Describes the Vendor information of the disk (Static) +serial = STRING ; Describes the Serial number of the disk (Static) +temperature_celsius = STRING ; Describes the operating temperature of the disk in Celsius (Dynamic) +fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) +fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) +disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Dynamic) +disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Dynamic) +reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Dynamic) +firmware = STRING ; Describes the Firmware version of the SSD (Dynamic) +health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Dynamic) ``` -NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by 512B.
+NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by the disk's logical block address sze (typically 512 bytes).
Example: For an SSD with name 'sda', the STATE_DB entry would be: From e6a47b74690d0a10a60f92d62d206e4e3970b27c Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Wed, 17 Apr 2024 05:44:10 +0000 Subject: [PATCH 13/26] Made changes per community review comments --- .../images/storagemond_SequenceDiagram.png | Bin 42607 -> 33034 bytes doc/storagemond/storagemond-hld.md | 91 +++++++++++------- 2 files changed, 58 insertions(+), 33 deletions(-) diff --git a/doc/storagemond/images/storagemond_SequenceDiagram.png b/doc/storagemond/images/storagemond_SequenceDiagram.png index eebba924e3c47ae8560c5096daf2e01dd1b20a75..c3be1faf5db6450d6dd3e1c780a11fc4ef79511d 100644 GIT binary patch literal 33034 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 B4Q~Jd literal 42607 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 diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 9e8f64154fd..ba939ccdaaf 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -15,7 +15,7 @@ The goal of the Storage Monitoring Daemon (storagemond) is to provide meaningful ## 2. Data Collection -We are intrested in the following characteristics that describe various aspects of the disk: +We are interested in the following characteristics that describe various aspects of the disk: ### **2.1 Dynamic Attributes** @@ -56,8 +56,12 @@ These fields are self-explanatory. ### **2.3 `storagemond` Daemon Flow** 1. The "storagemond" process will be initiated by the "pmon" Docker container. -2. Upon initialization, the daemon will gather static information utilizing S.M.A.R.T capabilities through instantiated class objects such as SsdUtil and EmmcUtil. This information will be subsequently updated in the StateDB. -3. The daemon will parse dynamic attributes also utilizing S.M.A.R.T capabilities via the corresponding class member functions, and update the StateDB on an hourly basis. + +2. As part of initialization process, the daemon will query the Config DB for an entry called `polling_interval` within a newly proposed table `STORAGEMOND_CONFIG` and use the value to set the looping frequency for getting dynamic informaton. In the absense of this table or entry, we would default to 3600 seconds. + +3. After initialization, the daemon will gather static information utilizing S.M.A.R.T capabilities through instantiated class objects such as SsdUtil and EmmcUtil. This information will be subsequently updated in the StateDB. + +4. The daemon will parse dynamic attributes also utilizing S.M.A.R.T capabilities via the corresponding class member functions, and update the StateDB per the preset frequency. **NOTE:** The design requires a concurrent PR wherein EmmcUtil, SsdUtil classes are enhanced to gather Disk and FS IO Read/Write stats and Reserved Blocks information as detailed in section [2.4.1 below](#241-ssdbase-api-additions). @@ -152,7 +156,7 @@ This class is a helper to the Storage Daemon class. - If the fd does not have `boot` or `loop`, add it as a key to the `devices` dictionary with a temporary value of `NoneType` ``` Example: - admin@str2-7050cx3-acs-01:/sys/block$ ls | grep -v -e "boot" -e "loop" + admin@sonic:/sys/block$ ls | grep -v -e "boot" -e "loop" mmcblk0 sda ``` @@ -188,7 +192,7 @@ devices = { - Instantiate an objectREAD NOTE of type `EmmcUtil` and add this object as value of the key ``` Example: - root@str2-7050cx3-acs-01:/sys/block$ ls | grep -i "mmcblk" | grep -v "boot" | grep -v "loop" + root@sonic:/sys/block$ ls | grep -i "mmcblk" | grep -v "boot" | grep -v "loop" mmcblk0 ``` @@ -235,18 +239,6 @@ def _parse_fsstats_file(self): Returns: None - """ - -def _update_fsstats_file(self, value, attr): - """ - Function to update the latest FS IO Reads/Writes (fs_reads/writes + corresponding value parsed from /proc/diskstats) to the disk's fsstats file - - Args: value, 'R' or 'W' to indicate which field to update in the file - - Returns: - N/A - """ - def get_fs_io_reads(self): """ Function to get the total number of reads on each disk by parsing the /proc/diskstats file @@ -269,19 +261,36 @@ def get_fs_io_writes(self): N/A """ ``` -**Accounting for reboots and uninended powercycles** +**Accounting for reboots and unintended powercycles** The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: -1. Introduction of a bind-mounted directory within the pmon container at `/host/storagemon/` which maps to `/host/pmon/storagemon/` on the host: - - This directory hosts a file named `fs-stats-<>`, where the latest filesystem Reads/Writes values for that disk are logged by the relevant functions within the `StorageCommon()` class each time they are invoked. - - Upon invocation, these functions extract the initial fs_reads and fs_writes values from the corresponding file, parse the corresponding FS IO reads and writes from the `/proc/diskstats` file, aggregate these values, update the file, and return the updated values to the caller. +1. Introduction of a bind-mounted directory within the pmon container at `/usr/share/storagemon/` which maps to `/host/pmon/storagemon/` on the host: + - This directory hosts a file named `fsio-rw-stats.json`, where the latest filesystem Reads/Writes values are saved. + - This file would be read by the daemon on initialization after a planned reboot of the system, or in a graceful `stormond` restart scenario. -2. Implementation of a script, tentatively named `parse-fs-stats.py`, to be invoked by SONiC's reboot utility: +2. Implementation of a script, tentatively named `parse-fsio-rw-stats.py`, to be invoked by SONiC's reboot utility: - This script would live in [sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/scripts) and would be called by the reboot script - - This script will be responsible for parsing and storing the most recent FS IO reads and writes from the `/proc/diskstats` file, particularly in planned reboot scenarios. - - These values would be stored in the `/host/pmon/storagemon/fs-stats-<>` file(s). + - This script will be responsible for parsing and storing the most recent FS IO reads and writes from the `fs-rw-stats.json` file. + - These values would be stored in the `/host/pmon/storagemon/fsio-rw-stats.json` file(s). + +**Daemon Restart / Reboot / Unintended Powercycle Scenario Behaviors** + +1. **Planned cold, fast and warm reboot scenario** + - Just before OS level reboot is called, we save the latest FSIO Reads and Writes from `/proc/diskstats` file to the `fsio-rw-stats.json` file by calling the `parse-fsio-rw-stats.py` script from the corresponding cold/fast/warm-reboot script. + - On reboot, the number of reads/writes as parsed from the `fsio-rw-stats.json` file would be greater than the latest value from `/proc/diskstats`. In this scenario, we consider the RW values from `fsio-rw-stats.json` as initial values and would add the latest RW values from `/proc/diskstats` file to them each time before writing to the database. + +2. **stormond graceful restart and crash scenario** + - A **pidfile** created by stormond upon initialization in the `/var/tmp` directory would help determine if `stormond` crashed or was gracefully shutdown. + - In either scenario, since the system did **not** reboot, the filesystem reads/writes would not be reset in the `/proc/diskstats` file. + - Therefore, when `stormond` restarts, we simply overwrite the pidlfile with the new PID of the daemon and carry on with normal functionality. + +3. **System unintended powercycle scenario** + - In this scenario, reads and writes counts in `/proc/diskstats` file is reset. + - Secondly, we would not have had a chance to save the latest RW counts to the `fsio-rw-stats.json` file. + - Thirdly, the pidfile would also be cleared and there would truly be no way to tell if this was a planned or unplanned powercycle. + - Therefore, this is the only scenario where there exists a possibility of drift between the measured FSIO RW and actual RW. This is a concession we are willing to make. **Logic for StorageCommon() get_fs_io_reads and get_fs_io_writes functions:** @@ -303,16 +312,20 @@ These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to r - If the name of the storage disk is found in the line, they return the value at the appropriate zero-based index (3 for reads, 7 for writes). - If no line contains the name of the storage disk, they save the respective values as 0. -4. **Combine the previous Reads/Writes with the new values**: - - Then they add the new reads and writes to the fs_reads/fs_writes variables, respectively, to get the latest count - - These values are written to the `fs-stats-<>` and returned to the caller +4. **Combine the initial Reads/Writes with the current values as needed**: + - First they determine whether there is a need to combine the current RW values with the initial RW values. + - In a planned reboot or graceful restart scenario, they add the current and new reads and writes, respectively, to get the latest count + - In an unplanned `stormond` crash scenario, they do NOT add the initial RW values with the newly parsed values. + - These values are then returned to the caller to be written to `STATE_DB`. #### **2.4.4 storagemond Class Diagram** ![image.png](images/StoragemonDaemonClassDiagram.png) -## **3. StateDB Schema** +## **3. Schema Changes** + +### **3.1 StateDB Schema** ``` ; Defines information for each Storage Disk in a device @@ -325,20 +338,21 @@ serial = STRING ; Describes the Serial number of temperature_celsius = STRING ; Describes the operating temperature of the disk in Celsius (Dynamic) fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) -disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (LBAs read) (Dynamic) -disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (LBAs written) (Dynamic) +disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (Bytes) (Dynamic) +disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (Bytes) (Dynamic) reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Dynamic) firmware = STRING ; Describes the Firmware version of the SSD (Dynamic) health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Dynamic) ``` -NOTE: 'LBA' stands for Logical Block Address. To get the raw value in bytes, multiply by the disk's logical block address sze (typically 512 bytes).
+NOTE: disk_io_reads and disk_io_writes return total LBAs read/written. 'LBA' stands for Logical Block Address. +To get the raw value in bytes, we multiply thr num. LBAs by the disk's logical block address size (typically 512 bytes).
Example: For an SSD with name 'sda', the STATE_DB entry would be: ``` -root@str2-7050cx3-acs-01:~# docker exec -it database bash -root@str2-7050cx3-acs-01:/# redis-cli -n 6 +root@sonic:~# docker exec -it database bash +root@sonic:/# redis-cli -n 6 127.0.0.1:6379[6]> keys STORAGE* 1) "STORAGE_INFO|mmcblk0" 2) "STORAGE_INFO|sda" @@ -367,6 +381,17 @@ root@str2-7050cx3-acs-01:/# redis-cli -n 6 ``` +### **3.2 ConfigDB Schema** +``` +; Defines information for each Storage Disk in a device + +key = STORAGEMOND_CONFIG| ; This key is for information about a specific storage disk - STORAGE_INFO|SDX + +; field = value + +polling_interval = STRING ; The polling frequency for reading dynamic information +``` + ## Future Work 1. Full support for eMMC From 6a363c58d0528787ca48fc40942c71c34d2889f7 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Thu, 18 Apr 2024 10:08:54 +0000 Subject: [PATCH 14/26] Added design considerations for various restart/reboot scenarios --- doc/storagemond/storagemond-hld.md | 92 ++++++++++++++++++------------ 1 file changed, 56 insertions(+), 36 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index ba939ccdaaf..692e3454ca8 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -261,36 +261,6 @@ def get_fs_io_writes(self): N/A """ ``` -**Accounting for reboots and unintended powercycles** - -The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: - -1. Introduction of a bind-mounted directory within the pmon container at `/usr/share/storagemon/` which maps to `/host/pmon/storagemon/` on the host: - - This directory hosts a file named `fsio-rw-stats.json`, where the latest filesystem Reads/Writes values are saved. - - This file would be read by the daemon on initialization after a planned reboot of the system, or in a graceful `stormond` restart scenario. - -2. Implementation of a script, tentatively named `parse-fsio-rw-stats.py`, to be invoked by SONiC's reboot utility: - - This script would live in [sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/scripts) and would be called by the reboot script - - This script will be responsible for parsing and storing the most recent FS IO reads and writes from the `fs-rw-stats.json` file. - - These values would be stored in the `/host/pmon/storagemon/fsio-rw-stats.json` file(s). - - -**Daemon Restart / Reboot / Unintended Powercycle Scenario Behaviors** - -1. **Planned cold, fast and warm reboot scenario** - - Just before OS level reboot is called, we save the latest FSIO Reads and Writes from `/proc/diskstats` file to the `fsio-rw-stats.json` file by calling the `parse-fsio-rw-stats.py` script from the corresponding cold/fast/warm-reboot script. - - On reboot, the number of reads/writes as parsed from the `fsio-rw-stats.json` file would be greater than the latest value from `/proc/diskstats`. In this scenario, we consider the RW values from `fsio-rw-stats.json` as initial values and would add the latest RW values from `/proc/diskstats` file to them each time before writing to the database. - -2. **stormond graceful restart and crash scenario** - - A **pidfile** created by stormond upon initialization in the `/var/tmp` directory would help determine if `stormond` crashed or was gracefully shutdown. - - In either scenario, since the system did **not** reboot, the filesystem reads/writes would not be reset in the `/proc/diskstats` file. - - Therefore, when `stormond` restarts, we simply overwrite the pidlfile with the new PID of the daemon and carry on with normal functionality. - -3. **System unintended powercycle scenario** - - In this scenario, reads and writes counts in `/proc/diskstats` file is reset. - - Secondly, we would not have had a chance to save the latest RW counts to the `fsio-rw-stats.json` file. - - Thirdly, the pidfile would also be cleared and there would truly be no way to tell if this was a planned or unplanned powercycle. - - Therefore, this is the only scenario where there exists a possibility of drift between the measured FSIO RW and actual RW. This is a concession we are willing to make. **Logic for StorageCommon() get_fs_io_reads and get_fs_io_writes functions:** @@ -318,6 +288,43 @@ These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to r - In an unplanned `stormond` crash scenario, they do NOT add the initial RW values with the newly parsed values. - These values are then returned to the caller to be written to `STATE_DB`. +#### **2.4.4 Accounting for reboots and unintended powercycles** + +The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: + +1. Introduction of a bind-mounted directory within the pmon container at `/usr/share/storagemon/` which maps to `/host/pmon/storagemon/` on the host: + - This directory hosts a file named `fsio-rw-stats.json`, where the latest filesystem Reads/Writes values are saved. + - This file would be read by the daemon on initialization after a planned reboot of the system, or in a graceful `stormond` restart scenario. + +2. Implementation of a script, tentatively named `fsio-rw-sync`, to be invoked by SONiC's reboot utility: + - This script would be called by the reboot script and would be responsible for parsing and storing the **most recent** FS IO reads and writes from the `fs-rw-stats.json` file. + - These values would be stored in the `/host/pmon/storagemon/fsio-rw-stats.json` file. + +3. A service provisionally named `fsio-sync.service` to enhance resilience against unintentional powerloss. + + - This service would call a script that would independently execute the `fsio-rw-sync` script at predefined intervals. This interval can be configured via the `STORAGEMOND_CONFIG` table within the `CONFIG_DB`. + + - The script is designed to log the most recent successful synchronization timestamp. This data will be recorded in a newly established table, provisionally titled `FSSTATS_SYNC`, which will reside within the `STATE_DB`. + +**Daemon Restart / Reboot / Unintended Powercycle Scenario Behaviors** + +1. **`stormond` or `pmon` graceful restart and crash scenario** + + - In both scenarios, as the host does not undergo a reboot, the file system read/write counters within the `/proc/diskstats` file remain unaltered. + - Parsing the `fs-rw-stats.json` file reveals that the read and write metrics from this file are consistently equal to or less than those extracted - from `/proc/diskstats`. + - This conclusively demonstrates that the device has not experienced a reboot. + - Consequently, upon a restart of stormond, operations resume as per standard protocols. + +2. **Planned cold, fast, and warm reboot scenario** + - Prior to invoking an OS-level reboot, the latest FSIO Read and Write metrics are captured from the `/proc/diskstats` file and stored into the `fsio-rw-stats.json` by executing the `fsio-rw-sync` script from the respective reboot script (cold, fast, or warm). + - Post-reboot, the read/write metrics as parsed from the `fsio-rw-stats.json` file will exceed the current values in `/proc/diskstats`. + - Under these conditions, the RW values from `fsio-rw-stats.json` are treated as baseline metrics, and subsequent RW values from `/proc/diskstats` are added to this baseline before database insertion. + +3. **System unintended powercycle scenario** + - This scenario results in a reset of the read/write counts within the `/proc/diskstats` file. + - Additionally, there is typically no opportunity to record the latest RW counts into the `fsio-rw-stats.json` file. + - Hence, this is the sole scenario where a discrepancy might arise between the documented FSIO RW counts and the actual RW counts. + - This potential discrepancy is acknowledged and accepted within the system's operational parameters. #### **2.4.4 storagemond Class Diagram** @@ -325,7 +332,7 @@ These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to r ## **3. Schema Changes** -### **3.1 StateDB Schema** +### **3.1 Storage Info StateDB Schema** ``` ; Defines information for each Storage Disk in a device @@ -381,15 +388,28 @@ root@sonic:/# redis-cli -n 6 ``` -### **3.2 ConfigDB Schema** +### **3.2 FS Stats Sync StateDB Schema** ``` -; Defines information for each Storage Disk in a device +; Defines information for FS Stats synchronization -key = STORAGEMOND_CONFIG| ; This key is for information about a specific storage disk - STORAGE_INFO|SDX +key = FSSTATS_SYNC ; This key is for information pertaining to synchronization of FSIO Reads/Writes -; field = value +; field = value + +successful_sync_time = STRING ; The latest successful sync time of FSIO reads and writes to file in '+%Y-%m-%d::%H:%M:%S' format + +``` + +### **3.3 ConfigDB Schema** +``` +; Defines information for stormon config + +key = STORAGEMOND_CONFIG ; This key is for information about a stormon daemon configuration + +; field = value -polling_interval = STRING ; The polling frequency for reading dynamic information +daemon_polling_interval = STRING ; The polling frequency for reading dynamic information +fsstats_sync_interval = STRING ; The frequency of FSIO Reads/Writes synchronization to location on disk ``` ## Future Work From 1af09357a910b1e6de2631bffd42279702c078f1 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 26 Apr 2024 07:48:03 +0000 Subject: [PATCH 15/26] Added core design algorithm --- doc/storagemond/storagemond-hld.md | 154 +++++++++++++++++------------ 1 file changed, 92 insertions(+), 62 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 692e3454ca8..aa1b31d4ee7 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -21,8 +21,10 @@ We are interested in the following characteristics that describe various aspects **The following attributes are updated frequently and describe the current state of the disk** -- File System IO Reads -- File System IO Writes +- Current File System IO Reads +- Current File System IO Writes +- Total File System IO Reads +- Total File System IO Writes - Disk IO Reads - Disk IO Writes - Reserved Blocks Count @@ -30,18 +32,20 @@ We are interested in the following characteristics that describe various aspects - Firmware - Health -**Filesystem IO Reads/Writes** - Parsed from the `/proc/diskstats` file, these values correspond to the number of reads and writes successfully carried out in the disk. These values would reset upon reboot. +**Current procfs Reads/Writes** - Parsed from the `/proc/diskstats` file, these values correspond to the number of reads and writes successfully carried out in the disk. These values would reset upon reboot. + +**Total procfs Reads/Writes** - A count of all reads/writes parsed from the `/proc/diskstats` file, these values correspond to the number of reads and writes successfully carried out in the disk across reboots and daemon crashes. These values are cumulative and would therefore not reset upon reboot. **Disk IO Reads/Writes** - These fields account for write-amplification and wear-leveling algorithms, and are persistent across reboots and powercycles. **Reserved Blocks Count** - Reserved blocks are managed by the drive's firmware, and their specific allocation and management may vary between disk manufacturers. The primary purposes of reserved blocks in a disk are: -- **Bad-block replacement:** When the firmware detects a bad block, it can map it to a reserved block and continue using the drive without data loss. -- **Wear Leveling:** Reserved blocks are used to replace or relocate data from cells that have been heavily used, ensuring that all cells are used evenly. -- **Over-Provisioning:** Over-provisioning helps maintain consistent performance and extends the lifespan of the disk by providing additional resources for wear leveling and bad block management. -- **Garbage collection:** When files are deleted or modified, the old data needs to be erased and marked as available for new data. Reserved blocks can help facilitate this process by providing a temporary location to move valid data from blocks that need to be erased. + - **Bad-block replacement:** When the firmware detects a bad block, it can map it to a reserved block and continue using the drive without data loss. + - **Wear Leveling:** Reserved blocks are used to replace or relocate data from cells that have been heavily used, ensuring that all cells are used evenly. + - **Over-Provisioning:** Over-provisioning helps maintain consistent performance and extends the lifespan of the disk by providing additional resources for wear leveling and bad block management. + - **Garbage collection:** When files are deleted or modified, the old data needs to be erased and marked as available for new data. Reserved blocks can help facilitate this process by providing a temporary location to move valid data from blocks that need to be erased. -- **Temperature, Firmware, Health** - These fields are self-explanatory +**Temperature, Firmware, Health** - These fields are self-explanatory ### **2.2 Static Attributes** @@ -59,11 +63,13 @@ These fields are self-explanatory. 2. As part of initialization process, the daemon will query the Config DB for an entry called `polling_interval` within a newly proposed table `STORAGEMOND_CONFIG` and use the value to set the looping frequency for getting dynamic informaton. In the absense of this table or entry, we would default to 3600 seconds. -3. After initialization, the daemon will gather static information utilizing S.M.A.R.T capabilities through instantiated class objects such as SsdUtil and EmmcUtil. This information will be subsequently updated in the StateDB. +3. Also as part of init, the daemon would reconcile the `STATE_DB`, a JSON file on disk and the current parsed information to calculate the cumulative values of fields that are subject to reset upon reboot. More on this is detailed in section [2.4.4](#244-accounting-for-reboots-and-unintended-powercycles) below. + +4. After initialization, the daemon will gather static information utilizing S.M.A.R.T capabilities through instantiated class objects such as SsdUtil and EmmcUtil. This information will be subsequently updated in the `STATE_DB`. -4. The daemon will parse dynamic attributes also utilizing S.M.A.R.T capabilities via the corresponding class member functions, and update the StateDB per the preset frequency. +5. The daemon would parse dynamic attributes also utilizing S.M.A.R.T capabilities via the corresponding class member functions, and update the `STATE_DB` per the preset frequency. -**NOTE:** The design requires a concurrent PR wherein EmmcUtil, SsdUtil classes are enhanced to gather Disk and FS IO Read/Write stats and Reserved Blocks information as detailed in section [2.4.1 below](#241-ssdbase-api-additions). +**NOTE:** The design requires a concurrent PR where EmmcUtil, SsdUtil classes are enhanced to gather Disk and FS IO Read/Write stats and Reserved Blocks information as detailed in section [2.4.1 below](#241-ssdbase-api-additions). This is detailed in the sequence diagram below: @@ -216,7 +222,7 @@ We would instantiate an object of the StorageDevices() class ``` we would then get static and dynamic information by leveraging the respective member function implementations of `SsdUtil` and `EmmcUtil`, as they both derive from `SsdBase`. -We then leverage the following proposed StateDB schema to store and stream information about each of these disks. +We then leverage the following proposed `STATE_DB` schema to store and stream information about each of these disks. **NOTE:**
@@ -231,17 +237,9 @@ We then leverage the following proposed StateDB schema to store and stream infor Specific data, such as Filesystem Input/Output (FS IO) Reads/Writes, can be uniformly collected regardless of the storage disk type, as it is extracted from files generated by the Linux Kernel. To streamline the process of gathering this information, we propose the implementation of a new parent class `StorageCommon()`, from which classes such as SsdUtil, EmmcUtil, USBUtil, and NVMUtil would inherit in addition to `SsdBase` (to be renamed `StorageBase`). This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, in `storage_common.py`. The `StorageCommon()` class will have the following functions: ``` -def _parse_fsstats_file(self): - """ - Function to parse a file containing the previous latest FS IO Reads/Writes values from a file (more on this in the subsequent section) and saves it to member variables - - Args: None - - Returns: None - def get_fs_io_reads(self): """ - Function to get the total number of reads on each disk by parsing the /proc/diskstats file + Function to get the latest reads on each disk by parsing the /proc/diskstats file Returns: The total number of FSIO reads @@ -252,7 +250,7 @@ def get_fs_io_reads(self): def get_fs_io_writes(self): """ - Function to get the total number of writes on each disk by parsing the /proc/diskstats file + Function to get the latest writes on each disk by parsing the /proc/diskstats file Returns: The total number of FSIO writes @@ -264,7 +262,7 @@ def get_fs_io_writes(self): **Logic for StorageCommon() get_fs_io_reads and get_fs_io_writes functions:** -These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to retrieve the total number of disk reads and writes, respectively, by parsing the `/proc/diskstats` file. They utilize similar logic, differing only in the column index used to extract the relevant information. +These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to retrieve the latest disk reads and writes, respectively, by parsing the `/proc/diskstats` file. They utilize similar logic, differing only in the column index used to extract the relevant information. 1. **Check for `psutil` Module**: - The functions first check if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. @@ -282,57 +280,70 @@ These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to r - If the name of the storage disk is found in the line, they return the value at the appropriate zero-based index (3 for reads, 7 for writes). - If no line contains the name of the storage disk, they save the respective values as 0. -4. **Combine the initial Reads/Writes with the current values as needed**: - - First they determine whether there is a need to combine the current RW values with the initial RW values. - - In a planned reboot or graceful restart scenario, they add the current and new reads and writes, respectively, to get the latest count - - In an unplanned `stormond` crash scenario, they do NOT add the initial RW values with the newly parsed values. - - These values are then returned to the caller to be written to `STATE_DB`. +4. **Return to caller**: + - These values are then returned to the caller to subsequently be written to `STATE_DB`. + - These values are also used to determine the total number of procfs reads and writes as explained in the following section + #### **2.4.4 Accounting for reboots and unintended powercycles** The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: 1. Introduction of a bind-mounted directory within the pmon container at `/usr/share/storagemon/` which maps to `/host/pmon/storagemon/` on the host: - - This directory hosts a file named `fsio-rw-stats.json`, where the latest filesystem Reads/Writes values are saved. + - This directory hosts a file named `fsio-rw-stats.json`, where the following values are stored: + - **most recent** Total reads and writes from the `STATE_DB`. + - **most recent** procfs reads and writes from the `STATE_DB`. + - This file would be read by the daemon on initialization after a planned reboot of the system, or in a graceful `stormond` restart scenario. 2. Implementation of a script, tentatively named `fsio-rw-sync`, to be invoked by SONiC's reboot utility: - - This script would be called by the reboot script and would be responsible for parsing and storing the **most recent** FS IO reads and writes from the `fs-rw-stats.json` file. - - These values would be stored in the `/host/pmon/storagemon/fsio-rw-stats.json` file. + - This script would be called by the several reboot scripts and would be responsible for parsing and storing the aforementioned paramenters just before OS-level reboot. + - This script provides a mechanism to sync the evanescent procFS reads and writes values from the `STATE_DB` before they are reset by the reboot. + +##### **2.4.4.1 Daemon Restart / Reboot / Unintended Powercycle Scenario Behaviors** -3. A service provisionally named `fsio-sync.service` to enhance resilience against unintentional powerloss. +1. **Planned cold, fast, and warm reboot scenario** - - This service would call a script that would independently execute the `fsio-rw-sync` script at predefined intervals. This interval can be configured via the `STORAGEMOND_CONFIG` table within the `CONFIG_DB`. + - Prior to invoking an OS-level reboot, the latest FSIO Read and Write metrics are captured from the `/proc/diskstats` file and stored into the `fsio-rw-stats.json` by executing the `fsio-rw-sync` script from the respective reboot script (cold, soft, or warm). + - Post-reboot, the read/write metrics as parsed from the `fsio-rw-stats.json` file will exceed the current values in `STATE_DB`. + - Under these conditions, the RW values from `fsio-rw-stats.json` are treated as baseline metrics, and subsequent RW values from `/proc/diskstats` are added to this baseline before database insertion. - - The script is designed to log the most recent successful synchronization timestamp. This data will be recorded in a newly established table, provisionally titled `FSSTATS_SYNC`, which will reside within the `STATE_DB`. -**Daemon Restart / Reboot / Unintended Powercycle Scenario Behaviors** +2. **Daemon (`stormond` or `pmon`) Crash Handling Scenario** -1. **`stormond` or `pmon` graceful restart and crash scenario** + - In the event of a daemon crash, the daemon ensures continuity by maintaining critical data points regarding filesystem I/O operations: - - In both scenarios, as the host does not undergo a reboot, the file system read/write counters within the `/proc/diskstats` file remain unaltered. - - Parsing the `fs-rw-stats.json` file reveals that the read and write metrics from this file are consistently equal to or less than those extracted - from `/proc/diskstats`. - - This conclusively demonstrates that the device has not experienced a reboot. - - Consequently, upon a restart of stormond, operations resume as per standard protocols. + - **Real-Time `/proc/diskstats` Values**: Directly parsed and stored temporarily, providing a snapshot of the most current filesystem activity. + - **Persisted `/proc/diskstats` Values in `STATE_DB`**: The last known values of procfs reads/writes before the crash, providing a baseline for comparison post-recovery. + - **Accumulated I/O Metrics in `STATE_DB`**: Represent the comprehensive record of disk read and write operations up to the last successful update before the crash. + + - The reconciliation of these data points post-crash allows for the calculation of interim disk operations: + + ``` + (latest_procfs - last_posted_statedb_procfs) = addnl_procfs_rw + + new total_procs_rw (to be posted to `STATE_DB`) = current_statedb_procfs_rw + addnl_procfs_rw + ``` + + - This computed value represents the adjusted total of read/write operations that should be recorded in the `STATE_DB` once the daemon is back online. + - The subsequent update to the `fsio-rw-stats.json` file ensures that these recalibrated values persist, thereby safeguarding against data loss due to daemon or container failures and facilitating seamless data continuity and accuracy. -2. **Planned cold, fast, and warm reboot scenario** - - Prior to invoking an OS-level reboot, the latest FSIO Read and Write metrics are captured from the `/proc/diskstats` file and stored into the `fsio-rw-stats.json` by executing the `fsio-rw-sync` script from the respective reboot script (cold, fast, or warm). - - Post-reboot, the read/write metrics as parsed from the `fsio-rw-stats.json` file will exceed the current values in `/proc/diskstats`. - - Under these conditions, the RW values from `fsio-rw-stats.json` are treated as baseline metrics, and subsequent RW values from `/proc/diskstats` are added to this baseline before database insertion. 3. **System unintended powercycle scenario** + - This scenario results in a reset of the read/write counts within the `/proc/diskstats` file. - Additionally, there is typically no opportunity to record the latest RW counts into the `fsio-rw-stats.json` file. - Hence, this is the sole scenario where a discrepancy might arise between the documented FSIO RW counts and the actual RW counts. - This potential discrepancy is acknowledged and accepted within the system's operational parameters. + #### **2.4.4 storagemond Class Diagram** ![image.png](images/StoragemonDaemonClassDiagram.png) ## **3. Schema Changes** -### **3.1 Storage Info StateDB Schema** +### **3.1 Storage Info `STATE_DB` Schema** ``` ; Defines information for each Storage Disk in a device @@ -340,16 +351,19 @@ key = STORAGE_INFO| ; This key is for information ab ; field = value -device_model = STRING ; Describes the Vendor information of the disk (Static) -serial = STRING ; Describes the Serial number of the disk (Static) -temperature_celsius = STRING ; Describes the operating temperature of the disk in Celsius (Dynamic) -fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) -fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) -disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (Bytes) (Dynamic) -disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (Bytes) (Dynamic) -reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Dynamic) -firmware = STRING ; Describes the Firmware version of the SSD (Dynamic) -health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Dynamic) +device_model = STRING ; Describes the Vendor information of the disk (Static) +serial = STRING ; Describes the Serial number of the disk (Static) +temperature_celsius = STRING ; Describes the operating temperature of the disk in Celsius (Dynamic) +fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) +fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) +current_fs_io_reads = STRING ; Describes the latest filesystem reads completed successfully (Dynamic) +current_fs_io_writes = STRING ; Describes the latest filesystem writes completed successfully (Dynamic) +fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) +disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (Bytes) (Dynamic) +disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (Bytes) (Dynamic) +reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Dynamic) +firmware = STRING ; Describes the Firmware version of the SSD (Dynamic) +health = STRING ; Describes the overall health of the SSD as a % value based on several SMART attrs (Dynamic) ``` NOTE: disk_io_reads and disk_io_writes return total LBAs read/written. 'LBA' stands for Logical Block Address. @@ -388,15 +402,15 @@ root@sonic:/# redis-cli -n 6 ``` -### **3.2 FS Stats Sync StateDB Schema** +### **3.2 FS Stats Sync `STATE_DB` Schema** ``` ; Defines information for FS Stats synchronization -key = FSSTATS_SYNC ; This key is for information pertaining to synchronization of FSIO Reads/Writes +key = STORAGE_INFO|FSSTATS_SYNC ; This key is for information pertaining to synchronization of FSIO Reads/Writes ; field = value -successful_sync_time = STRING ; The latest successful sync time of FSIO reads and writes to file in '+%Y-%m-%d::%H:%M:%S' format +successful_sync_time = STRING ; The latest successful sync time of FSIO reads and writes to file in '+%Y-%m-%d::%H:%M:%S' format ``` @@ -404,7 +418,7 @@ successful_sync_time = STRING ; The latest successful sync time of ``` ; Defines information for stormon config -key = STORAGEMOND_CONFIG ; This key is for information about a stormon daemon configuration +key = STORAGEMOND_CONFIG ; This key is for information about a stormon daemon configuration ; field = value @@ -412,11 +426,27 @@ daemon_polling_interval = STRING ; The polling frequency for re fsstats_sync_interval = STRING ; The frequency of FSIO Reads/Writes synchronization to location on disk ``` +## **4. Test Plan** + +The following is the `sonic-mgmt` test plan for the daemon. The first column represents various testing scenarios. The other columns represent the intended status of various components of the daemon. + +| **Event** | **State_DB** | **JSON** |  **PROCFS STATUS** | **JSON SYNCED WITH `STATE_DB`?** | **STORMON RESTARTED** | +| ---------------------- | ------------ | --------- | ----------------------- | ----------------------------- | --------------------- | +| | | | | | | +| Init | CLEARED | CLEARED | CLEARED, Initial Values | YES | YES | +| Planned Cold Reboot | CLEARED | NOT RESET | CLEARED, Initial Values | YES | YES | +| Planned Soft Reboot | CLEARED | NOT RESET | CLEARED, Initial Values | YES | YES | +| Planned Warm Reboot | NOT RESET | NOT RESET | CLEARED, Initial Values | YES | YES | +| Unplanned daemon crash | NOT RESET | NOT RESET | NOT RESET | UNSURE | YES | +| Unplanned system crash | CLEARED | NOT RESET | CLEARED, Initial Values | UNSURE | YES | + + ## Future Work -1. Full support for eMMC -2. Support for USB and NVMe storage disks -3. Refactor `ssdutil` [in sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/ssdutil) to cover all storage types, including changing the name of the utility to 'storageutil' +1. Fulfill the sonic-mgmt test plan +2. Full support for eMMC +3. Support for USB and NVMe storage disks +4. Refactor `ssdutil` [in sonic-utilities](https://github.com/sonic-net/sonic-utilities/tree/master/ssdutil) to cover all storage types, including changing the name of the utility to 'storageutil'


[Back to top](#1-overview) From b5f948e54b882b2c7c80de78376e1f71a507f4ee Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Tue, 30 Apr 2024 01:52:54 +0000 Subject: [PATCH 16/26] Changed FSSTATS_SYNC format --- doc/storagemond/storagemond-hld.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index aa1b31d4ee7..5a4eb42f7e5 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -298,7 +298,7 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese 2. Implementation of a script, tentatively named `fsio-rw-sync`, to be invoked by SONiC's reboot utility: - This script would be called by the several reboot scripts and would be responsible for parsing and storing the aforementioned paramenters just before OS-level reboot. - - This script provides a mechanism to sync the evanescent procFS reads and writes values from the `STATE_DB` before they are reset by the reboot. + - This script provides a mechanism to sync the procFS reads and writes values from the `STATE_DB` before they are reset by the reboot. ##### **2.4.4.1 Daemon Restart / Reboot / Unintended Powercycle Scenario Behaviors** @@ -410,7 +410,7 @@ key = STORAGE_INFO|FSSTATS_SYNC ; This key is for inform ; field = value -successful_sync_time = STRING ; The latest successful sync time of FSIO reads and writes to file in '+%Y-%m-%d::%H:%M:%S' format +successful_sync_time = STRING ; The latest successful sync time of FSIO reads and writes to file in UNIX timestamp format ``` From 30b58239c59ecbfbf0cb2c75974c684a114de12d Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Mon, 6 May 2024 20:06:47 +0000 Subject: [PATCH 17/26] Added YANG model and pseudo code for planned reboots/daemon crash scenarios --- doc/storagemond/storagemond-hld.md | 78 +++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 5a4eb42f7e5..1ce4cc2ef46 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -308,6 +308,18 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese - Post-reboot, the read/write metrics as parsed from the `fsio-rw-stats.json` file will exceed the current values in `STATE_DB`. - Under these conditions, the RW values from `fsio-rw-stats.json` are treated as baseline metrics, and subsequent RW values from `/proc/diskstats` are added to this baseline before database insertion. + ``` + # Prior to reboot + capture_fsio_rw_metrics(): + execute(fsio-rw-sync) # Execute the fsio-rw-sync script to capture FSIO Read and Write metrics + parse_and_store_metrics() # Parse metrics from /proc/diskstats and store in fsio-rw-stats.json + + # Post-reboot + baseline_metrics = read_baseline_metrics_from_json() # Read baseline reads and writes from fsio-rw-stats.json + current_metrics = read_current_metrics_from_procfs() # Read current reads and writes from /proc/diskstats + updated_metrics = calculate_updated_metrics(baseline_metrics, current_metrics) # Calculate updated metrics as updated_metrics = baseline_metrics + current_metrics + insert_into_database(updated_metrics) # Insert updated metrics into database + ``` 2. **Daemon (`stormond` or `pmon`) Crash Handling Scenario** @@ -319,15 +331,30 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese - The reconciliation of these data points post-crash allows for the calculation of interim disk operations: - ``` - (latest_procfs - last_posted_statedb_procfs) = addnl_procfs_rw - - new total_procs_rw (to be posted to `STATE_DB`) = current_statedb_procfs_rw + addnl_procfs_rw - ``` + ``` + addnl_procfs_rw = (latest_procfs - last_posted_statedb_procfs) + new total_procs_rw (to be posted to `STATE_DB`) = current_statedb_procfs_rw + addnl_procfs_rw + ``` - This computed value represents the adjusted total of read/write operations that should be recorded in the `STATE_DB` once the daemon is back online. - The subsequent update to the `fsio-rw-stats.json` file ensures that these recalibrated values persist, thereby safeguarding against data loss due to daemon or container failures and facilitating seamless data continuity and accuracy. + ``` + # In the event of a daemon crash + + # Reconciliation post-crash + compute_interim_disk_operations(): + statedb_accumulated_procfs_rw = Hitherto accumulated procfs reads and writes from the STATE_DB + statedb_latest_procfs_rw = Last parsed procfs reads and writes in STATE_DB + current_procfs_rw = Current FSIO reads and writes from /proc/diskstats + addnl_procfs_rw = current_procfs_rw - statedb_latest_procfs_rw + new_total_procs_rw = statedb_accumulated_procfs_rw + addnl_procfs_rw + update_db_with_new_metrics(new_total_procs_rw, current_procfs_rw) # Update STATE_DB with recalibrated values + + # Subsequent update to fsio-rw-stats.json + update_fsio_rw_stats_file(): + write_updated_metrics_to_json(new_total_procs_rw) # Write recalibrated values to fsio-rw-stats.json + ``` 3. **System unintended powercycle scenario** @@ -347,9 +374,9 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese ``` ; Defines information for each Storage Disk in a device -key = STORAGE_INFO| ; This key is for information about a specific storage disk - STORAGE_INFO|SDX +key = STORAGE_INFO| ; This key is for information about a specific storage disk - STORAGE_INFO|SDX -; field = value +; field = value device_model = STRING ; Describes the Vendor information of the disk (Static) serial = STRING ; Describes the Serial number of the disk (Static) @@ -414,7 +441,10 @@ successful_sync_time = STRING ; The latest successful ``` -### **3.3 ConfigDB Schema** +### **3.3 ConfigDB Schema and YANG model** + +**Schema** + ``` ; Defines information for stormon config @@ -426,6 +456,38 @@ daemon_polling_interval = STRING ; The polling frequency for re fsstats_sync_interval = STRING ; The frequency of FSIO Reads/Writes synchronization to location on disk ``` +**YANG Model** + +``` +container sonic-stormond-config { + + container STORMOND_CONFIG { + + description "stormond_config table in config_db.json"; + + list STORMOND_CONFIG_LIST { + + key "daemon_polling_interval"; + + leaf daemon_polling_interval { + description "Polling inerval for Storage Monitoring Daemon in STORMOND_CONFIG table"; + type string { + length 1..32; + } + } + + leaf fsstats_sync_interval { + description "FSSTATS JSON file syncing interval for the Storage Monitoring Daemon in STORMOND_CONFIG table"; + type string { + length 1..32; + } + } + + } + } + } +``` + ## **4. Test Plan** The following is the `sonic-mgmt` test plan for the daemon. The first column represents various testing scenarios. The other columns represent the intended status of various components of the daemon. From 56d57c1175c2f27a115d5894185950f222a9a0b4 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Tue, 7 May 2024 19:32:12 +0000 Subject: [PATCH 18/26] Cleaned up YANG model --- doc/storagemond/storagemond-hld.md | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 1ce4cc2ef46..a8076d7a3a1 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -465,24 +465,18 @@ container sonic-stormond-config { description "stormond_config table in config_db.json"; - list STORMOND_CONFIG_LIST { - - key "daemon_polling_interval"; - - leaf daemon_polling_interval { - description "Polling inerval for Storage Monitoring Daemon in STORMOND_CONFIG table"; - type string { - length 1..32; - } + leaf daemon_polling_interval { + description "Polling inerval for Storage Monitoring Daemon in STORMOND_CONFIG table"; + type string { + length 1..32; } + } - leaf fsstats_sync_interval { - description "FSSTATS JSON file syncing interval for the Storage Monitoring Daemon in STORMOND_CONFIG table"; - type string { - length 1..32; - } + leaf fsstats_sync_interval { + description "FSSTATS JSON file syncing interval for the Storage Monitoring Daemon in STORMOND_CONFIG table"; + type string { + length 1..32; } - } } } From 6632690be11c3957c0567a5822a9004f08f486df Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Tue, 7 May 2024 22:03:05 +0000 Subject: [PATCH 19/26] Added key and example for CONFIG_DB, enhanced YANG model accordingly --- doc/storagemond/storagemond-hld.md | 37 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index a8076d7a3a1..f07fdad5bce 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -448,7 +448,7 @@ successful_sync_time = STRING ; The latest successful ``` ; Defines information for stormon config -key = STORAGEMOND_CONFIG ; This key is for information about a stormon daemon configuration +key = STORMOND_CONFIG|INTERVALS ; This key is for information about stormon daemon polling interval configurations ; field = value @@ -456,6 +456,20 @@ daemon_polling_interval = STRING ; The polling frequency for re fsstats_sync_interval = STRING ; The frequency of FSIO Reads/Writes synchronization to location on disk ``` +Example: `stormond` configured with daemon polling interval of 60s and the JSON file sync interval as 360 seconds: + +``` +127.0.0.1:6379[4]> KEYS STORMOND* +1) "STORMOND_CONFIG|INTERVALS" +127.0.0.1:6379[4]> HGETALL "STORMOND_CONFIG|INTERVALS" +1) "daemon_polling_interval" +2) "60" +3) "fsstats_sync_interval" +4) "360" +127.0.0.1:6379[4]> + +``` + **YANG Model** ``` @@ -465,17 +479,20 @@ container sonic-stormond-config { description "stormond_config table in config_db.json"; - leaf daemon_polling_interval { - description "Polling inerval for Storage Monitoring Daemon in STORMOND_CONFIG table"; - type string { - length 1..32; + container INTERVALS { + + leaf daemon_polling_interval { + description "Polling inerval for Storage Monitoring Daemon in STORMOND_CONFIG table"; + type string { + length 1..32; + } } - } - leaf fsstats_sync_interval { - description "FSSTATS JSON file syncing interval for the Storage Monitoring Daemon in STORMOND_CONFIG table"; - type string { - length 1..32; + leaf fsstats_sync_interval { + description "FSSTATS JSON file syncing interval for the Storage Monitoring Daemon in STORMOND_CONFIG table"; + type string { + length 1..32; + } } } } From 3fd9db6a4d435da794f1c015b1ec4654ddccfcf8 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Thu, 9 May 2024 17:43:14 +0000 Subject: [PATCH 20/26] Changed fsio-rw-sync invocation from reboot script to database service script. Changed CONFIG_DB interval types. --- doc/storagemond/storagemond-hld.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index f07fdad5bce..5930b152359 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -304,7 +304,7 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese 1. **Planned cold, fast, and warm reboot scenario** - - Prior to invoking an OS-level reboot, the latest FSIO Read and Write metrics are captured from the `/proc/diskstats` file and stored into the `fsio-rw-stats.json` by executing the `fsio-rw-sync` script from the respective reboot script (cold, soft, or warm). + - Prior to invoking an OS-level reboot, the latest FSIO Read and Write metrics are captured from the `/proc/diskstats` file and stored into the `fsio-rw-stats.json` by executing the `fsio-rw-sync` script from the systemd service script that stops the database container. - Post-reboot, the read/write metrics as parsed from the `fsio-rw-stats.json` file will exceed the current values in `STATE_DB`. - Under these conditions, the RW values from `fsio-rw-stats.json` are treated as baseline metrics, and subsequent RW values from `/proc/diskstats` are added to this baseline before database insertion. @@ -383,8 +383,8 @@ serial = STRING ; Describes the Serial numbe temperature_celsius = STRING ; Describes the operating temperature of the disk in Celsius (Dynamic) fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) -current_fs_io_reads = STRING ; Describes the latest filesystem reads completed successfully (Dynamic) -current_fs_io_writes = STRING ; Describes the latest filesystem writes completed successfully (Dynamic) +latest_fs_io_reads = STRING ; Describes the latest number of filesystem reads completed successfully (Dynamic) +latest_fs_io_writes = STRING ; Describes the latest number of filesystem writes completed successfully (Dynamic) fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (Bytes) (Dynamic) disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (Bytes) (Dynamic) @@ -452,8 +452,8 @@ key = STORMOND_CONFIG|INTERVALS ; This key is for infor ; field = value -daemon_polling_interval = STRING ; The polling frequency for reading dynamic information -fsstats_sync_interval = STRING ; The frequency of FSIO Reads/Writes synchronization to location on disk +daemon_polling_interval = UINT32 ; The polling frequency for reading dynamic information +fsstats_sync_interval = UINT32 ; The frequency of FSIO Reads/Writes synchronization to location on disk ``` Example: `stormond` configured with daemon polling interval of 60s and the JSON file sync interval as 360 seconds: @@ -483,15 +483,15 @@ container sonic-stormond-config { leaf daemon_polling_interval { description "Polling inerval for Storage Monitoring Daemon in STORMOND_CONFIG table"; - type string { - length 1..32; + type uint32 { + range "1..4294967295"; } } leaf fsstats_sync_interval { description "FSSTATS JSON file syncing interval for the Storage Monitoring Daemon in STORMOND_CONFIG table"; - type string { - length 1..32; + type uint32 { + range "1..4294967295"; } } } From 1707051efe74cf96077b356def8642f9b7f0bcc9 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 10 May 2024 22:49:47 +0000 Subject: [PATCH 21/26] Updated example of redis db output --- doc/storagemond/storagemond-hld.md | 50 +++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 5930b152359..81225398031 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -381,11 +381,10 @@ key = STORAGE_INFO| ; This key is for informatio device_model = STRING ; Describes the Vendor information of the disk (Static) serial = STRING ; Describes the Serial number of the disk (Static) temperature_celsius = STRING ; Describes the operating temperature of the disk in Celsius (Dynamic) -fs_io_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) -fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) -latest_fs_io_reads = STRING ; Describes the latest number of filesystem reads completed successfully (Dynamic) -latest_fs_io_writes = STRING ; Describes the latest number of filesystem writes completed successfully (Dynamic) -fs_io_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) +total_fsio_reads = STRING ; Describes the total number of filesystem reads completed successfully (Dynamic) +total_fsio_writes = STRING ; Describes the total number of filesystem writes completed successfully (Dynamic) +latest_fsio_reads = STRING ; Describes the latest number of filesystem reads completed successfully (Dynamic) +latest_fsio_writes = STRING ; Describes the latest number of filesystem writes completed successfully (Dynamic) disk_io_reads = STRING ; Describes the total number of reads completed successfully from the SSD (Bytes) (Dynamic) disk_io_writes = STRING ; Describes the total number of writes completed on the SSD (Bytes) (Dynamic) reserved_blocks = STRING ; Describes the reserved blocks count of the SSD (Dynamic) @@ -401,31 +400,32 @@ Example: For an SSD with name 'sda', the STATE_DB entry would be: ``` root@sonic:~# docker exec -it database bash root@sonic:/# redis-cli -n 6 -127.0.0.1:6379[6]> keys STORAGE* -1) "STORAGE_INFO|mmcblk0" -2) "STORAGE_INFO|sda" -127.0.0.1:6379[6]> -127.0.0.1:6379[6]> hgetall STORAGE_INFO|sda +127.0.0.1:6379[6]> hgetall "STORAGE_INFO|sda" 1) "device_model" - 2) "SATA SSD" + 2) "InnoDisk Corp. - mSATA 3IE4" 3) "serial" - 4) "SPG2043056Z" + 4) "BCA11803120900005" 5) "firmware" - 6) "FW1241" + 6) "S0000000" 7) "health" - 8) "N/A" + 8) "37.500" 9) "temperature" -10) "30" -11) "fs_io_reads" -12) "28753" -13) "fs_io_writes" -14) "92603" -15) "disk_io_reads" -16) "15388141951" -17) "disk_io_writes" -18) "46070618960" -19) "reserved_blocks" -20) "32" +10) "37" +11) "latest_fsio_reads" +12) "93437" +13) "latest_fsio_writes" +14) "58743" +15) "total_fsio_reads" +16) "93437" +17) "total_fsio_writes" +18) "58743" +19) "disk_io_reads" +20) "5515433" +21) "disk_io_writes" +22) "863698" +23) "reserved_blocks" +24) "135" + ``` From 5403a0f8fdb01dbab1793fe08f6a843de02b7395 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Fri, 10 May 2024 23:05:05 +0000 Subject: [PATCH 22/26] Added a better example to diff between latest and total FSIO reads/writes --- doc/storagemond/storagemond-hld.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 81225398031..ef742e76b70 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -399,7 +399,10 @@ Example: For an SSD with name 'sda', the STATE_DB entry would be: ``` root@sonic:~# docker exec -it database bash -root@sonic:/# redis-cli -n 6 +admin@str2-dx010-acs-7:~$ redis-cli -n 6 +127.0.0.1:6379[6]> keys STORAGE* +1) "STORAGE_INFO|sda" +127.0.0.1:6379[6]> 127.0.0.1:6379[6]> hgetall "STORAGE_INFO|sda" 1) "device_model" 2) "InnoDisk Corp. - mSATA 3IE4" @@ -410,23 +413,24 @@ root@sonic:/# redis-cli -n 6 7) "health" 8) "37.500" 9) "temperature" -10) "37" +10) "38" 11) "latest_fsio_reads" -12) "93437" +12) "15507" 13) "latest_fsio_writes" -14) "58743" +14) "3775" 15) "total_fsio_reads" -16) "93437" +16) "353083" 17) "total_fsio_writes" -18) "58743" +18) "70146" 19) "disk_io_reads" -20) "5515433" +20) "5515700" 21) "disk_io_writes" -22) "863698" +22) "863702" 23) "reserved_blocks" 24) "135" + ``` ### **3.2 FS Stats Sync `STATE_DB` Schema** From 26c7d08598855487b76fad94dad37cc18912ed0f Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Wed, 15 May 2024 22:06:38 +0000 Subject: [PATCH 23/26] Removed reference to non-psutil scenario. Revert FSIO script invocation from service script to reboot scripts --- doc/storagemond/storagemond-hld.md | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index ef742e76b70..a7a7b0dc4e9 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -267,20 +267,11 @@ These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to r 1. **Check for `psutil` Module**: - The functions first check if the `psutil` module is available in the current environment by examining the `sys.modules` dictionary. -2. **Use `psutil` Module (if available)**: - - If `psutil` is available: - - The functions retrieve disk I/O counters, specifying the disk for which to get the counters. - - They then get the read or write count for the specified disk using `read_count` or `write_count` respectively. - -3. **Fallback to Parsing Disk Stats File**: - - If `psutil` is not available: - - The functions open the `/proc/diskstats` file - - They read the contents of the file and iterate over each line. - - For each line, they check if the name of the storage disk is present. - - If the name of the storage disk is found in the line, they return the value at the appropriate zero-based index (3 for reads, 7 for writes). - - If no line contains the name of the storage disk, they save the respective values as 0. - -4. **Return to caller**: +2. **Use `psutil` Module to**: + - Retrieve disk I/O counters, specifying the disk for which to get the counters. + - Get the read or write count for the specified disk using `read_count` or `write_count` respectively. + +3. **Return to caller**: - These values are then returned to the caller to subsequently be written to `STATE_DB`. - These values are also used to determine the total number of procfs reads and writes as explained in the following section @@ -304,7 +295,7 @@ The reset of values in `/proc/diskstats` upon device reboot or power cycle prese 1. **Planned cold, fast, and warm reboot scenario** - - Prior to invoking an OS-level reboot, the latest FSIO Read and Write metrics are captured from the `/proc/diskstats` file and stored into the `fsio-rw-stats.json` by executing the `fsio-rw-sync` script from the systemd service script that stops the database container. + - Prior to invoking an OS-level reboot, the latest FSIO Read and Write metrics are captured from the `/proc/diskstats` file and stored into the `fsio-rw-stats.json` by invoking the `fsio-rw-sync` script from the respective `/usr/local/bin/*reboot` script. - Post-reboot, the read/write metrics as parsed from the `fsio-rw-stats.json` file will exceed the current values in `STATE_DB`. - Under these conditions, the RW values from `fsio-rw-stats.json` are treated as baseline metrics, and subsequent RW values from `/proc/diskstats` are added to this baseline before database insertion. From 34417cc024a99ff8d74b9ed2e142092fb49218e5 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Thu, 16 May 2024 05:21:10 +0000 Subject: [PATCH 24/26] Updated facts about config_db. Updated YANG model. Cleaned up naming. --- doc/storagemond/storagemond-hld.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index a7a7b0dc4e9..e36231f5eb5 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -61,7 +61,7 @@ These fields are self-explanatory. 1. The "storagemond" process will be initiated by the "pmon" Docker container. -2. As part of initialization process, the daemon will query the Config DB for an entry called `polling_interval` within a newly proposed table `STORAGEMOND_CONFIG` and use the value to set the looping frequency for getting dynamic informaton. In the absense of this table or entry, we would default to 3600 seconds. +2. As part of initialization process, the daemon will query the Config DB for fields called `daemon_polling_interval` and `fsstats_sync_interval` within a newly proposed table `STORMOND_CONFIG|INTERVALS` and use the value to set the looping frequency for getting dynamic informaton and syncing this information to disk, respectively. In the absense of this table/field, we would default to 3600 seconds for the polling interval and 86400 seconds for sync interval. 3. Also as part of init, the daemon would reconcile the `STATE_DB`, a JSON file on disk and the current parsed information to calculate the cumulative values of fields that are subject to reset upon reboot. More on this is detailed in section [2.4.4](#244-accounting-for-reboots-and-unintended-powercycles) below. @@ -176,7 +176,7 @@ devices = { } ``` -**get_storage_device_object() Logic:** +**_storage_device_object_factory() Logic:** - For each key in the `devices` dictionary: - If key starts with the term `sd`: @@ -206,7 +206,7 @@ devices = { Assuming a device contains the following storage disks: ``` -root@str-a7280cr3-2:~# ls /sys/block/ +root@sonic:~# ls /sys/block/ loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 **mmcblk0** mmcblk0boot0 mmcblk0boot1 **sda** ``` @@ -234,7 +234,7 @@ We then leverage the following proposed `STATE_DB` schema to store and stream in #### **2.4.3 Support for common implementations** -Specific data, such as Filesystem Input/Output (FS IO) Reads/Writes, can be uniformly collected regardless of the storage disk type, as it is extracted from files generated by the Linux Kernel. To streamline the process of gathering this information, we propose the implementation of a new parent class `StorageCommon()`, from which classes such as SsdUtil, EmmcUtil, USBUtil, and NVMUtil would inherit in addition to `SsdBase` (to be renamed `StorageBase`). This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_ssd` directory, in `storage_common.py`. The `StorageCommon()` class will have the following functions: +Specific data, such as Filesystem Input/Output (FS IO) Reads/Writes, can be uniformly collected regardless of the storage disk type, as it is extracted from files generated by the Linux Kernel. To streamline the process of gathering this information, we propose the implementation of a new parent class `StorageCommon()`, from which classes such as SsdUtil, EmmcUtil, USBUtil, and NVMUtil would inherit in addition to `SsdBase` (to be renamed `StorageBase`). This proposed class will reside in the `src/sonic-platform-common/sonic_platform_base/sonic_storage` directory (formerly `sonic_ssd`), in `storage_common.py`. The `StorageCommon()` class will have the following functions: ``` def get_fs_io_reads(self): @@ -280,7 +280,7 @@ These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to r The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: -1. Introduction of a bind-mounted directory within the pmon container at `/usr/share/storagemon/` which maps to `/host/pmon/storagemon/` on the host: +1. Introduction of a bind-mounted directory within the pmon container at `/usr/share/stormond/` which maps to `/host/pmon/stormond/` on the host: - This directory hosts a file named `fsio-rw-stats.json`, where the following values are stored: - **most recent** Total reads and writes from the `STATE_DB`. - **most recent** procfs reads and writes from the `STATE_DB`. @@ -441,7 +441,7 @@ successful_sync_time = STRING ; The latest successful **Schema** ``` -; Defines information for stormon config +; Defines information for stormond config key = STORMOND_CONFIG|INTERVALS ; This key is for information about stormon daemon polling interval configurations @@ -481,6 +481,7 @@ container sonic-stormond-config { type uint32 { range "1..4294967295"; } + default "3600"; } leaf fsstats_sync_interval { @@ -488,6 +489,7 @@ container sonic-stormond-config { type uint32 { range "1..4294967295"; } + default "86400"; } } } From 2a00465358c142c8a592678d046aa6b85e8dcecd Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Mon, 20 May 2024 18:40:59 +0000 Subject: [PATCH 25/26] Changed impl. details of FSIO sync in planned reboot scenarios --- doc/storagemond/storagemond-hld.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index e36231f5eb5..85b615e8f0a 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -278,18 +278,17 @@ These two functions, `get_fs_io_reads` and `get_fs_io_writes`, are designed to r #### **2.4.4 Accounting for reboots and unintended powercycles** -The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design considerations: +The reset of values in `/proc/diskstats` upon device reboot or power cycle presents a challenge for maintaining long-term data integrity. To mitigate this challenge, we propose the following design consideration: -1. Introduction of a bind-mounted directory within the pmon container at `/usr/share/stormond/` which maps to `/host/pmon/stormond/` on the host: +Introduction of a bind-mounted directory within the pmon container at `/usr/share/stormond/` which maps to `/host/pmon/stormond/` on the host: - This directory hosts a file named `fsio-rw-stats.json`, where the following values are stored: - **most recent** Total reads and writes from the `STATE_DB`. - **most recent** procfs reads and writes from the `STATE_DB`. - This file would be read by the daemon on initialization after a planned reboot of the system, or in a graceful `stormond` restart scenario. + - In a soft or cold reboot scenario, the reboot utility sends a SIGTERM to `stormond` via the PMON container, which is caught by the daemon. At this point, the FSIO reads and writes are synced to JSON file just before exit. -2. Implementation of a script, tentatively named `fsio-rw-sync`, to be invoked by SONiC's reboot utility: - - This script would be called by the several reboot scripts and would be responsible for parsing and storing the aforementioned paramenters just before OS-level reboot. - - This script provides a mechanism to sync the procFS reads and writes values from the `STATE_DB` before they are reset by the reboot. +2. Changes to ##### **2.4.4.1 Daemon Restart / Reboot / Unintended Powercycle Scenario Behaviors** From 0d7e8090283d6c60782db32c4ca8f53e97d29d49 Mon Sep 17 00:00:00 2001 From: Ashwin Srinivasan Date: Mon, 20 May 2024 18:55:01 +0000 Subject: [PATCH 26/26] Modified Test plan language --- doc/storagemond/storagemond-hld.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/storagemond/storagemond-hld.md b/doc/storagemond/storagemond-hld.md index 85b615e8f0a..3228db820d7 100644 --- a/doc/storagemond/storagemond-hld.md +++ b/doc/storagemond/storagemond-hld.md @@ -502,12 +502,12 @@ The following is the `sonic-mgmt` test plan for the daemon. The first column rep | **Event** | **State_DB** | **JSON** |  **PROCFS STATUS** | **JSON SYNCED WITH `STATE_DB`?** | **STORMON RESTARTED** | | ---------------------- | ------------ | --------- | ----------------------- | ----------------------------- | --------------------- | | | | | | | | -| Init | CLEARED | CLEARED | CLEARED, Initial Values | YES | YES | -| Planned Cold Reboot | CLEARED | NOT RESET | CLEARED, Initial Values | YES | YES | -| Planned Soft Reboot | CLEARED | NOT RESET | CLEARED, Initial Values | YES | YES | -| Planned Warm Reboot | NOT RESET | NOT RESET | CLEARED, Initial Values | YES | YES | -| Unplanned daemon crash | NOT RESET | NOT RESET | NOT RESET | UNSURE | YES | -| Unplanned system crash | CLEARED | NOT RESET | CLEARED, Initial Values | UNSURE | YES | +| System First Boot | EMPTY | EMPTY | Initial Values | YES | YES | +| Planned Cold Reboot | CLEARED | PERSISTED | RESET, Initial Values | YES | YES | +| Planned Soft Reboot | CLEARED | PERSISTED | RESET, Initial Values | YES | YES | +| Planned Warm Reboot | PERSISTED | PERSISTED | RESET, Initial Values | YES | YES | +| Unplanned daemon crash | PERSISTED | PERSISTED | PERSISTED | UNSURE | YES | +| Unplanned system crash | CLEARED | PERSISTED | RESET, Initial Values | UNSURE | YES | ## Future Work