On 8/11/20 9:08 PM, Han Zhou wrote: > > > On Tue, Aug 11, 2020 at 11:35 AM Ilya Maximets <i.maxim...@ovn.org > <mailto:i.maxim...@ovn.org>> wrote: >> >> On 8/11/20 8:15 AM, Han Zhou wrote: >> > This reverts commit 68bc6f88a3a36549fcd3b6248c25c5e2e6deb8f3. >> > The commit causes a regression in OVN scale test. ovn-northd's CPU >> > more than doubled for the test scenario: create and bind 12k ports. >> > Below are some perf data of ovn-northd when running command: >> > ovn-nbctl --wait=sb sync >> > >> > Before reverting this commit: >> > - 92.42% 0.62% ovn-northd ovn-northd [.] main >> > - 91.80% main >> > + 68.93% ovn_db_run (inlined) >> > + 22.45% ovsdb_idl_loop_commit_and_wait >> > >> > After reverting this commit: >> > - 92.84% 0.60% ovn-northd ovn-northd [.] main >> > - 92.24% main >> > + 92.03% ovn_db_run (inlined) >> > >> > Reverting this commit avoided 22.45% of the CPU caused by >> > ovsdb_idl_loop_commit_and_wait(). >> > >> > The commit changed the logic of ovsdb_idl_txn_write__() by adding >> > the check "datum->keys && datum->values" before discarding unchanged >> > data in a transaction. However, it is normal for OVSDB clients ( >> > such as ovn-northd) to try to set columns with same empty data >> > as it is before the transaction. IDL would discard these changes >> > and avoid sending big transactions to server (which would end up as >> > no-op on server side). In the ovn scale test scenario mentioned above, >> > each iteration of ovn-northd would send a transaction to server that >> > includes all rows of the huge Port_Binding table, which caused the >> > significant CPU increase of ovn-northd (and also the OVN SB DB server), >> > resulted in longer end to end latency of OVN configuration changes. >> >> Good catch! >> >> So, if the row has at least one empty column, the whole row will be sent >> as update and rejected by ovsdb-server because nothing really changed. >> Is it correct? >> > > To be more accurate, any columns that are set by the transaction (using one > of the xxx_set_xxx APIs) will be sent to server, even if they are not changed > at all. The columns that are not set by the transaction won't be sent. > The columns doesn't have to be empty, since in most cases datum->values are > empty (if it is not a map), even if the column is not empty. > The server wouldn't reject, instead, it makes no change and simply returns > success to the client. There is no correctness issue, but this impacts > performance - waste of CPU and bandwidth.
Oh. I missed that 'values' are almost always NULL since most of datum types doesn't have them. So, the issue is even worse than I though initially. > >> > >> > For the original problem the commit 68bc6f88 was trying to fix, it >> > doesn't seem to be a real problem. The NULL deref reported by >> > Coverity may be addressed in a future patch using a different approach, >> > if necessary. I looked through the code and this coverity defect looks like a false positive indeed, because ovsdb_datum_equals() or any other function here always checks for the type before using and NULL might be only in OVSDB_TYPE_VOID case or if n == 0, which is also checked. Thanks, Han! Applied to master and branch-2.14. Best regards, Ilya Maximets. _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev