diff mbox series

[ovs-dev,v3,1/2] dpctl: dpif: add kernel datapath cache hit output

Message ID 161477951589.1196657.2121239357230989491.stgit@ebuild
State Changes Requested
Headers show
Series dpctl: cache visibility/configuration enhancements | expand

Commit Message

Eelco Chaudron March 3, 2021, 1:52 p.m. UTC
This patch adds cache usage statistics to the output:

$ ovs-dpctl show
system@ovs-system:
  lookups: hit:24 missed:71 lost:0
  flows: 0
  masks: hit:334 total:0 hit/pkt:3.52
  cache: hit:4 hit rate:4.2105%
  port 0: ovs-system (internal)
  port 1: genev_sys_6081 (geneve: packet_type=ptap)
  port 2: br-int (internal)
  port 3: br-ex (internal)
  port 4: eth2
  port 5: sw1p1 (internal)
  port 6: sw0p4 (internal)

Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
---
v2: - Changed precision to 2 digits
    - Handle missing kernel feature at netlink level
v3: - Rebase on the latest master branch

 datapath/linux/compat/include/linux/openvswitch.h |    2 +-
 lib/dpctl.c                                       |    9 +++++++++
 lib/dpif-netdev.c                                 |    1 +
 lib/dpif-netlink.c                                |    9 +++++++++
 lib/dpif.h                                        |    2 ++
 5 files changed, 22 insertions(+), 1 deletion(-)

Comments

Flavio Leitner March 3, 2021, 8:44 p.m. UTC | #1
On Wed, Mar 03, 2021 at 02:52:33PM +0100, Eelco Chaudron wrote:
> This patch adds cache usage statistics to the output:
> 
> $ ovs-dpctl show
> system@ovs-system:
>   lookups: hit:24 missed:71 lost:0
>   flows: 0
>   masks: hit:334 total:0 hit/pkt:3.52
>   cache: hit:4 hit rate:4.2105%

nit: maybe the maintainer can fix that to be 2 digits as the code below.

>   port 0: ovs-system (internal)
>   port 1: genev_sys_6081 (geneve: packet_type=ptap)
>   port 2: br-int (internal)
>   port 3: br-ex (internal)
>   port 4: eth2
>   port 5: sw1p1 (internal)
>   port 6: sw0p4 (internal)
> 
> Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
> ---
> v2: - Changed precision to 2 digits
>     - Handle missing kernel feature at netlink level
> v3: - Rebase on the latest master branch
> 
>  datapath/linux/compat/include/linux/openvswitch.h |    2 +-
>  lib/dpctl.c                                       |    9 +++++++++
>  lib/dpif-netdev.c                                 |    1 +
>  lib/dpif-netlink.c                                |    9 +++++++++
>  lib/dpif.h                                        |    2 ++
>  5 files changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/datapath/linux/compat/include/linux/openvswitch.h b/datapath/linux/compat/include/linux/openvswitch.h
> index 875de2025..690d78871 100644
> --- a/datapath/linux/compat/include/linux/openvswitch.h
> +++ b/datapath/linux/compat/include/linux/openvswitch.h
> @@ -122,8 +122,8 @@ struct ovs_dp_megaflow_stats {
>  	__u64 n_mask_hit;	 /* Number of masks used for flow lookups. */
>  	__u32 n_masks;		 /* Number of masks for the datapath. */
>  	__u32 pad0;		 /* Pad for future expension. */
> +	__u64 n_cache_hit;       /* Number of cache matches for flow lookups. */

another nit: the datapath uses tab + spaces.

Otherwise:
Acked-by: Flavio Leitner <fbl@sysclose.org>

Thanks
fbl


>  	__u64 pad1;		 /* Pad for future expension. */
> -	__u64 pad2;		 /* Pad for future expension. */
>  };
>  
>  struct ovs_vport_stats {
> diff --git a/lib/dpctl.c b/lib/dpctl.c
> index ef8ae7402..acc677974 100644
> --- a/lib/dpctl.c
> +++ b/lib/dpctl.c
> @@ -611,6 +611,15 @@ show_dpif(struct dpif *dpif, struct dpctl_params *dpctl_p)
>              dpctl_print(dpctl_p, "  masks: hit:%"PRIu64" total:%"PRIu32
>                                   " hit/pkt:%.2f\n",
>                          stats.n_mask_hit, stats.n_masks, avg);
> +
> +            if (stats.n_cache_hit != UINT64_MAX) {
> +                double avg_hits = n_pkts ?
> +                    (double) stats.n_cache_hit / n_pkts * 100 : 0.0;
> +
> +                dpctl_print(dpctl_p,
> +                            "  cache: hit:%"PRIu64" hit rate:%.2f%%\n",
> +                            stats.n_cache_hit, avg_hits);
> +            }
>          }
>      }
>  
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 816945375..c3d3aac36 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -2025,6 +2025,7 @@ dpif_netdev_get_stats(const struct dpif *dpif, struct dpif_dp_stats *stats)
>      }
>      stats->n_masks = UINT32_MAX;
>      stats->n_mask_hit = UINT64_MAX;
> +    stats->n_cache_hit = UINT64_MAX;
>  
>      return 0;
>  }
> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
> index ceb56c685..392b894c5 100644
> --- a/lib/dpif-netlink.c
> +++ b/lib/dpif-netlink.c
> @@ -672,9 +672,18 @@ dpif_netlink_get_stats(const struct dpif *dpif_, struct dpif_dp_stats *stats)
>              stats->n_masks = dp.megaflow_stats->n_masks;
>              stats->n_mask_hit = get_32aligned_u64(
>                  &dp.megaflow_stats->n_mask_hit);
> +            stats->n_cache_hit = get_32aligned_u64(
> +                &dp.megaflow_stats->n_cache_hit);
> +
> +            if (!stats->n_cache_hit) {
> +                /* Old kernels don't use this field and always
> +                 * report zero instead. Disable this stat. */
> +                stats->n_cache_hit = UINT64_MAX;
> +            }
>          } else {
>              stats->n_masks = UINT32_MAX;
>              stats->n_mask_hit = UINT64_MAX;
> +            stats->n_cache_hit = UINT64_MAX;
>          }
>          ofpbuf_delete(buf);
>      }
> diff --git a/lib/dpif.h b/lib/dpif.h
> index ecda896c7..600e4522c 100644
> --- a/lib/dpif.h
> +++ b/lib/dpif.h
> @@ -429,6 +429,8 @@ struct dpif_dp_stats {
>      uint64_t n_missed;          /* Number of flow table misses. */
>      uint64_t n_lost;            /* Number of misses not sent to userspace. */
>      uint64_t n_flows;           /* Number of flows present. */
> +    uint64_t n_cache_hit;       /* Number of mega flow mask cache hits for
> +                                   flow table matches. */
>      uint64_t n_mask_hit;        /* Number of mega flow masks visited for
>                                     flow table matches. */
>      uint32_t n_masks;           /* Number of mega flow masks. */
>
Eelco Chaudron March 4, 2021, 8 a.m. UTC | #2
On 3 Mar 2021, at 21:44, Flavio Leitner wrote:

> On Wed, Mar 03, 2021 at 02:52:33PM +0100, Eelco Chaudron wrote:
>> This patch adds cache usage statistics to the output:
>>
>> $ ovs-dpctl show
>> system@ovs-system:
>>   lookups: hit:24 missed:71 lost:0
>>   flows: 0
>>   masks: hit:334 total:0 hit/pkt:3.52
>>   cache: hit:4 hit rate:4.2105%
>
> nit: maybe the maintainer can fix that to be 2 digits as the code 
> below.
>
>>   port 0: ovs-system (internal)
>>   port 1: genev_sys_6081 (geneve: packet_type=ptap)
>>   port 2: br-int (internal)
>>   port 3: br-ex (internal)
>>   port 4: eth2
>>   port 5: sw1p1 (internal)
>>   port 6: sw0p4 (internal)
>>
>> Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
>> ---
>> v2: - Changed precision to 2 digits
>>     - Handle missing kernel feature at netlink level
>> v3: - Rebase on the latest master branch
>>
>>  datapath/linux/compat/include/linux/openvswitch.h |    2 +-
>>  lib/dpctl.c                                       |    9 +++++++++
>>  lib/dpif-netdev.c                                 |    1 +
>>  lib/dpif-netlink.c                                |    9 +++++++++
>>  lib/dpif.h                                        |    2 ++
>>  5 files changed, 22 insertions(+), 1 deletion(-)
>>
>> diff --git a/datapath/linux/compat/include/linux/openvswitch.h 
>> b/datapath/linux/compat/include/linux/openvswitch.h
>> index 875de2025..690d78871 100644
>> --- a/datapath/linux/compat/include/linux/openvswitch.h
>> +++ b/datapath/linux/compat/include/linux/openvswitch.h
>> @@ -122,8 +122,8 @@ struct ovs_dp_megaflow_stats {
>>  	__u64 n_mask_hit;	 /* Number of masks used for flow lookups. */
>>  	__u32 n_masks;		 /* Number of masks for the datapath. */
>>  	__u32 pad0;		 /* Pad for future expension. */
>> +	__u64 n_cache_hit;       /* Number of cache matches for flow 
>> lookups. */
>
> another nit: the datapath uses tab + spaces.
>
> Otherwise:
> Acked-by: Flavio Leitner <fbl@sysclose.org>

Thanks Flavio! Ilya do you need a v4 for the nits?

>>  	__u64 pad1;		 /* Pad for future expension. */
>> -	__u64 pad2;		 /* Pad for future expension. */
>>  };
>>
>>  struct ovs_vport_stats {
>> diff --git a/lib/dpctl.c b/lib/dpctl.c
>> index ef8ae7402..acc677974 100644
>> --- a/lib/dpctl.c
>> +++ b/lib/dpctl.c
>> @@ -611,6 +611,15 @@ show_dpif(struct dpif *dpif, struct dpctl_params 
>> *dpctl_p)
>>              dpctl_print(dpctl_p, "  masks: hit:%"PRIu64" 
>> total:%"PRIu32
>>                                   " hit/pkt:%.2f\n",
>>                          stats.n_mask_hit, stats.n_masks, avg);
>> +
>> +            if (stats.n_cache_hit != UINT64_MAX) {
>> +                double avg_hits = n_pkts ?
>> +                    (double) stats.n_cache_hit / n_pkts * 100 : 0.0;
>> +
>> +                dpctl_print(dpctl_p,
>> +                            "  cache: hit:%"PRIu64" hit 
>> rate:%.2f%%\n",
>> +                            stats.n_cache_hit, avg_hits);
>> +            }
>>          }
>>      }
>>
>> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
>> index 816945375..c3d3aac36 100644
>> --- a/lib/dpif-netdev.c
>> +++ b/lib/dpif-netdev.c
>> @@ -2025,6 +2025,7 @@ dpif_netdev_get_stats(const struct dpif *dpif, 
>> struct dpif_dp_stats *stats)
>>      }
>>      stats->n_masks = UINT32_MAX;
>>      stats->n_mask_hit = UINT64_MAX;
>> +    stats->n_cache_hit = UINT64_MAX;
>>
>>      return 0;
>>  }
>> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
>> index ceb56c685..392b894c5 100644
>> --- a/lib/dpif-netlink.c
>> +++ b/lib/dpif-netlink.c
>> @@ -672,9 +672,18 @@ dpif_netlink_get_stats(const struct dpif *dpif_, 
>> struct dpif_dp_stats *stats)
>>              stats->n_masks = dp.megaflow_stats->n_masks;
>>              stats->n_mask_hit = get_32aligned_u64(
>>                  &dp.megaflow_stats->n_mask_hit);
>> +            stats->n_cache_hit = get_32aligned_u64(
>> +                &dp.megaflow_stats->n_cache_hit);
>> +
>> +            if (!stats->n_cache_hit) {
>> +                /* Old kernels don't use this field and always
>> +                 * report zero instead. Disable this stat. */
>> +                stats->n_cache_hit = UINT64_MAX;
>> +            }
>>          } else {
>>              stats->n_masks = UINT32_MAX;
>>              stats->n_mask_hit = UINT64_MAX;
>> +            stats->n_cache_hit = UINT64_MAX;
>>          }
>>          ofpbuf_delete(buf);
>>      }
>> diff --git a/lib/dpif.h b/lib/dpif.h
>> index ecda896c7..600e4522c 100644
>> --- a/lib/dpif.h
>> +++ b/lib/dpif.h
>> @@ -429,6 +429,8 @@ struct dpif_dp_stats {
>>      uint64_t n_missed;          /* Number of flow table misses. */
>>      uint64_t n_lost;            /* Number of misses not sent to 
>> userspace. */
>>      uint64_t n_flows;           /* Number of flows present. */
>> +    uint64_t n_cache_hit;       /* Number of mega flow mask cache 
>> hits for
>> +                                   flow table matches. */
>>      uint64_t n_mask_hit;        /* Number of mega flow masks visited 
>> for
>>                                     flow table matches. */
>>      uint32_t n_masks;           /* Number of mega flow masks. */
>>
>
> -- 
> fbl
diff mbox series

Patch

diff --git a/datapath/linux/compat/include/linux/openvswitch.h b/datapath/linux/compat/include/linux/openvswitch.h
index 875de2025..690d78871 100644
--- a/datapath/linux/compat/include/linux/openvswitch.h
+++ b/datapath/linux/compat/include/linux/openvswitch.h
@@ -122,8 +122,8 @@  struct ovs_dp_megaflow_stats {
 	__u64 n_mask_hit;	 /* Number of masks used for flow lookups. */
 	__u32 n_masks;		 /* Number of masks for the datapath. */
 	__u32 pad0;		 /* Pad for future expension. */
+	__u64 n_cache_hit;       /* Number of cache matches for flow lookups. */
 	__u64 pad1;		 /* Pad for future expension. */
-	__u64 pad2;		 /* Pad for future expension. */
 };
 
 struct ovs_vport_stats {
diff --git a/lib/dpctl.c b/lib/dpctl.c
index ef8ae7402..acc677974 100644
--- a/lib/dpctl.c
+++ b/lib/dpctl.c
@@ -611,6 +611,15 @@  show_dpif(struct dpif *dpif, struct dpctl_params *dpctl_p)
             dpctl_print(dpctl_p, "  masks: hit:%"PRIu64" total:%"PRIu32
                                  " hit/pkt:%.2f\n",
                         stats.n_mask_hit, stats.n_masks, avg);
+
+            if (stats.n_cache_hit != UINT64_MAX) {
+                double avg_hits = n_pkts ?
+                    (double) stats.n_cache_hit / n_pkts * 100 : 0.0;
+
+                dpctl_print(dpctl_p,
+                            "  cache: hit:%"PRIu64" hit rate:%.2f%%\n",
+                            stats.n_cache_hit, avg_hits);
+            }
         }
     }
 
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 816945375..c3d3aac36 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2025,6 +2025,7 @@  dpif_netdev_get_stats(const struct dpif *dpif, struct dpif_dp_stats *stats)
     }
     stats->n_masks = UINT32_MAX;
     stats->n_mask_hit = UINT64_MAX;
+    stats->n_cache_hit = UINT64_MAX;
 
     return 0;
 }
diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index ceb56c685..392b894c5 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -672,9 +672,18 @@  dpif_netlink_get_stats(const struct dpif *dpif_, struct dpif_dp_stats *stats)
             stats->n_masks = dp.megaflow_stats->n_masks;
             stats->n_mask_hit = get_32aligned_u64(
                 &dp.megaflow_stats->n_mask_hit);
+            stats->n_cache_hit = get_32aligned_u64(
+                &dp.megaflow_stats->n_cache_hit);
+
+            if (!stats->n_cache_hit) {
+                /* Old kernels don't use this field and always
+                 * report zero instead. Disable this stat. */
+                stats->n_cache_hit = UINT64_MAX;
+            }
         } else {
             stats->n_masks = UINT32_MAX;
             stats->n_mask_hit = UINT64_MAX;
+            stats->n_cache_hit = UINT64_MAX;
         }
         ofpbuf_delete(buf);
     }
diff --git a/lib/dpif.h b/lib/dpif.h
index ecda896c7..600e4522c 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -429,6 +429,8 @@  struct dpif_dp_stats {
     uint64_t n_missed;          /* Number of flow table misses. */
     uint64_t n_lost;            /* Number of misses not sent to userspace. */
     uint64_t n_flows;           /* Number of flows present. */
+    uint64_t n_cache_hit;       /* Number of mega flow mask cache hits for
+                                   flow table matches. */
     uint64_t n_mask_hit;        /* Number of mega flow masks visited for
                                    flow table matches. */
     uint32_t n_masks;           /* Number of mega flow masks. */