Skip to content

[ZmqOrch] Optimize memory by popping batch size at a time - #3910

Merged
prsunny merged 5 commits into
sonic-net:masterfrom
vivekrnv:pop_batch_zmq
Oct 9, 2025
Merged

[ZmqOrch] Optimize memory by popping batch size at a time#3910
prsunny merged 5 commits into
sonic-net:masterfrom
vivekrnv:pop_batch_zmq

Conversation

@vivekrnv

@vivekrnv vivekrnv commented Sep 30, 2025

Copy link
Copy Markdown
Contributor

What I did

  1. Used a reference instead of a unnecessary copy of a set object
  2. Optimize memory by popping batch size at a time

NOTE: Please merge only after the below two PR's are merged

sonic-net/sonic-swss-common#1084
sonic-net/sonic-sairedis#1660

Why I did it

To reduce peak memory usage when applying high-volume dash configuration

How I verified it

Details if related

Signed-off-by: Vivek Reddy <vkarri@nvidia.com>
Signed-off-by: Vivek <vkarri@nvidia.com>
Signed-off-by: Vivek <vkarri@nvidia.com>
Signed-off-by: Vivek Reddy <vkarri@nvidia.com>
@vivekrnv
vivekrnv requested a review from prsunny as a code owner September 30, 2025 19:02
@mssonicbld

Copy link
Copy Markdown
Collaborator

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@prsunny

prsunny commented Oct 2, 2025

Copy link
Copy Markdown
Collaborator

@liuh-80 , please review/signoff

mssonicbld added a commit to mssonicbld/sonic-buildimage-msft that referenced this pull request Oct 2, 2025
<!--
     Please make sure you've read and understood our contributing guidelines:
     https://github.com/Azure/SONiC/blob/gh-pages/CONTRIBUTING.md

     ** Make sure all your commits include a signature generated with `git commit -s` **

     If this is a bug fix, make sure your description includes "fixes #xxxx", or
     "closes #xxxx" or "resolves #xxxx"

     Please provide the following information:
-->

#### Why I did it

Increase the pop batch size and Max Bulker limit to 65536 to speed up applying the high volume Dash configuration

Depends on
sonic-net/sonic-sairedis#1660
sonic-net/sonic-swss-common#1084
sonic-net/sonic-swss#3910

##### Work item tracking
- Microsoft ADO **(number only)**:

#### How I did it

#### How to verify it

```
root@sonic:/home/admin# ps -aux | grep orch
root       11118  1.5  0.4 464804 267368 pts/0   Sl   02:50   0:00 /usr/bin/orchagent -d /var/log/swss -b 65536 -z zmq_sync -k 65536 -m B0:CF:0E:20:8E:DE -q tcp://eth0-midplane

2025 Sep 30 18:48:38.911835 sonic NOTICE swss#orchagent: :- main: Setting maximum bulk size in bulk mode as 65536
```

Apply Scale config and verify

<!--
If PR needs to be backported, then the PR must be tested against the base branch and the earliest backport release branch and provide tested image version on these two branches. For example, if the PR is requested for master, 202211 and 202012, then the requester needs to provide test results on master and 202012.
-->

#### Which release branch to backport (provide reason below if selected)

<!--
- Note we only backport fixes to a release branch, *not* features!
- Please also provide a reason for the backporting below.
- e.g.
- [x] 202006
-->

- [ ] 202205
- [ ] 202211
- [ ] 202305
- [ ] 202311
- [ ] 202405
- [ ] 202411
- [ ] 202505

#### Tested branch (Please provide the tested image version)

<!--
- Please provide tested image version
- e.g.
- [x] 20201231.100
-->

- [ ] <!-- image version 1 -->
- [ ] <!-- image version 2 -->

#### Description for the changelog
<!--
Write a short (one line) summary that describes the changes in this
pull request for inclusion in the changelog:
-->

<!--
 Ensure to add label/tag for the feature raised. example - PR#2174 under sonic-utilities repo. where, Generic Config and Update feature has been labelled as GCU.
-->

#### Link to config_db schema for YANG module changes
<!--
Provide a link to config_db schema for the table for which YANG model
is defined
Link should point to correct section on https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/doc/Configuration.md
-->

#### A picture of a cute animal (not mandatory but encouraged)
mssonicbld added a commit to Azure/sonic-buildimage-msft that referenced this pull request Oct 3, 2025
…1691)

<!--
 Please make sure you've read and understood our contributing guidelines:
 https://github.com/Azure/SONiC/blob/gh-pages/CONTRIBUTING.md

 failure_prs.log skip_prs.log Make sure all your commits include a signature generated with `git commit -s` **

 If this is a bug fix, make sure your description includes "fixes #xxxx", or
 "closes #xxxx" or "resolves #xxxx"

 Please provide the following information:
-->

#### Why I did it

Increase the pop batch size and Max Bulker limit to 65536 to speed up applying the high volume Dash configuration

Depends on
sonic-net/sonic-sairedis#1660
sonic-net/sonic-swss-common#1084
sonic-net/sonic-swss#3910

##### Work item tracking
- Microsoft ADO **(number only)**:

#### How I did it

#### How to verify it

```
root@sonic:/home/admin# ps -aux | grep orch
root 11118 1.5 0.4 464804 267368 pts/0 Sl 02:50 0:00 /usr/bin/orchagent -d /var/log/swss -b 65536 -z zmq_sync -k 65536 -m B0:CF:0E:20:8E:DE -q tcp://eth0-midplane

2025 Sep 30 18:48:38.911835 sonic NOTICE swss#orchagent: :- main: Setting maximum bulk size in bulk mode as 65536
```

Apply Scale config and verify

<!--
If PR needs to be backported, then the PR must be tested against the base branch and the earliest backport release branch and provide tested image version on these two branches. For example, if the PR is requested for master, 202211 and 202012, then the requester needs to provide test results on master and 202012.
-->

#### Which release branch to backport (provide reason below if selected)

<!--
- Note we only backport fixes to a release branch, *not* features!
- Please also provide a reason for the backporting below.
- e.g.
- [x] 202006
-->

- [ ] 202205
- [ ] 202211
- [ ] 202305
- [ ] 202311
- [ ] 202405
- [ ] 202411
- [ ] 202505

#### Tested branch (Please provide the tested image version)

<!--
- Please provide tested image version
- e.g.
- [x] 20201231.100
-->

- [ ] <!-- image version 1 -->
- [ ] <!-- image version 2 -->

#### Description for the changelog
<!--
Write a short (one line) summary that describes the changes in this
pull request for inclusion in the changelog:
-->

<!--
 Ensure to add label/tag for the feature raised. example - PR#2174 under sonic-utilities repo. where, Generic Config and Update feature has been labelled as GCU.
-->

#### Link to config_db schema for YANG module changes
<!--
Provide a link to config_db schema for the table for which YANG model
is defined
Link should point to correct section on https://github.com/Azure/sonic-buildimage/blob/master/src/sonic-yang-models/doc/Configuration.md
-->

#### A picture of a cute animal (not mandatory but encouraged)
@mssonicbld

Copy link
Copy Markdown
Collaborator

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@vivekrnv

vivekrnv commented Oct 8, 2025

Copy link
Copy Markdown
Contributor Author

/azpw run Azure.sonic-swss

@mssonicbld

Copy link
Copy Markdown
Collaborator

/AzurePipelines run Azure.sonic-swss

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@prsunny
prsunny merged commit 7ea13fc into sonic-net:master Oct 9, 2025
15 checks passed
@mssonicbld

Copy link
Copy Markdown
Collaborator

Cherry-pick PR to msft-202506: Azure/sonic-swss.msft#159

balanokia pushed a commit to balanokia/sonic-swss that referenced this pull request Nov 17, 2025
…3910)

* [ZmqOrch] Optimize memory by popping batch size at a time
What I did

Used a reference instead of a unnecessary copy of a set object
Optimize memory by popping batch size at a time
NOTE: Please merge only after the below two PR's are merged

sonic-net/sonic-swss-common#1084
sonic-net/sonic-sairedis#1660
theasianpianist pushed a commit to theasianpianist/sonic-swss that referenced this pull request Feb 4, 2026
…3910)

* [ZmqOrch] Optimize memory by popping batch size at a time
What I did

Used a reference instead of a unnecessary copy of a set object
Optimize memory by popping batch size at a time
NOTE: Please merge only after the below two PR's are merged

sonic-net/sonic-swss-common#1084
sonic-net/sonic-sairedis#1660

Signed-off-by: Lawrence Lee <lawlee@microsoft.com>
baorliu pushed a commit to baorliu/sonic-swss that referenced this pull request Feb 23, 2026
…3910)

* [ZmqOrch] Optimize memory by popping batch size at a time
What I did

Used a reference instead of a unnecessary copy of a set object
Optimize memory by popping batch size at a time
NOTE: Please merge only after the below two PR's are merged

sonic-net/sonic-swss-common#1084
sonic-net/sonic-sairedis#1660

Signed-off-by: Baorong Liu <96146196+baorliu@users.noreply.github.com>
@venkit-nexthop

Copy link
Copy Markdown
Contributor

Tagging @deepak-singhal0408 for viz
We found that this change cuts the route-download performance almost by half.
I wanted to understand the change a bit more. By removing the do..while loop in zmqorch.cpp how does it save memory? The input queue would still fill up isnt it?

@deepak-singhal0408

Copy link
Copy Markdown
Contributor

Tagging @deepak-singhal0408 for viz We found that this change cuts the route-download performance almost by half. I wanted to understand the change a bit more. By removing the do..while loop in zmqorch.cpp how does it save memory? The input queue would still fill up isnt it?

@venkit-nexthop since this PR is merged already, can you help create a new issue for the regression you are observing, while tagging this PR?

venkit-nexthop added a commit to venkit-nexthop/sonic-swss that referenced this pull request May 15, 2026
PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
venkit-nexthop added a commit to venkit-nexthop/sonic-swss that referenced this pull request May 15, 2026
PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
venkit-nexthop added a commit to venkit-nexthop/sonic-swss that referenced this pull request May 15, 2026
PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
venkit-nexthop added a commit to venkit-nexthop/sonic-swss that referenced this pull request May 15, 2026
PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
venkit-nexthop added a commit to venkit-nexthop/sonic-swss that referenced this pull request May 16, 2026
PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
venkit-nexthop added a commit to venkit-nexthop/sonic-swss that referenced this pull request May 17, 2026
PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
venkit-nexthop added a commit to venkit-nexthop/sonic-swss that referenced this pull request May 18, 2026
PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
deepak-singhal0408 added a commit to deepak-singhal0408/sonic-swss that referenced this pull request May 19, 2026
Restore do...while drain loop in ZmqConsumer::execute() for the
non-ordered queue path. The single pops() call from PR sonic-net#3910 may
leave messages unprocessed if more arrive during execution, hurting
route convergence throughput under high ZMQ load.

Signed-off-by: Deepak Singhal <deepsinghal@microsoft.com>
prsunny pushed a commit that referenced this pull request May 27, 2026
* [zmqorch]: Restore drain-until-empty consumer for non-DPU/fabric

PR #3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in #3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
Yogapriya-cisco pushed a commit to prhoskot/sonic-swss that referenced this pull request Jul 13, 2026
…3910)

* [ZmqOrch] Optimize memory by popping batch size at a time
What I did

Used a reference instead of a unnecessary copy of a set object
Optimize memory by popping batch size at a time
NOTE: Please merge only after the below two PR's are merged

sonic-net/sonic-swss-common#1084
sonic-net/sonic-sairedis#1660

Signed-off-by: Yogapriya Mohankumar <ymohanku@cisco.com>
Yogapriya-cisco pushed a commit to prhoskot/sonic-swss that referenced this pull request Jul 13, 2026
…ic-net#4578)

* [zmqorch]: Restore drain-until-empty consumer for non-DPU/fabric

PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
Signed-off-by: Yogapriya Mohankumar <ymohanku@cisco.com>
leenr pushed a commit to leenr/sonic-swss that referenced this pull request Aug 4, 2026
…3910)

* [ZmqOrch] Optimize memory by popping batch size at a time
What I did

Used a reference instead of a unnecessary copy of a set object
Optimize memory by popping batch size at a time
NOTE: Please merge only after the below two PR's are merged

sonic-net/sonic-swss-common#1084
sonic-net/sonic-sairedis#1660
leenr pushed a commit to leenr/sonic-swss that referenced this pull request Aug 4, 2026
…ic-net#4578)

* [zmqorch]: Restore drain-until-empty consumer for non-DPU/fabric

PR sonic-net#3910 changed ZmqConsumer::execute() to perform a single batch pop
per invocation, primarily to reduce peak memory in DASH (DPU) workloads.
For non-DPU / non-fabric switches that receive high volumes of APPL_DB
route updates from fpmsyncd, this regressed throughput: each execute()
call no longer drains the consumer table, so updates take many more
polls to apply.

Introduce a ZmqRouteConsumer subclass that restores the prior
drain-until-empty loop in execute(). ZmqOrch::addConsumer() selects
ZmqRouteConsumer for non-DPU / non-fabric switch types; DPU and fabric
continue to use ZmqConsumer to preserve the bounded-memory behavior
added in sonic-net#3910.

Also define gMySwitchType in orchagent/p4orch/tests/test_main.cpp so
p4orch_tests links once zmqorch.cpp references the global.

Signed-off-by: Venkit Kasiviswanathan <venkit@nexthop.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants