Skip to content

Commit

Permalink
bridge: Fix high cpu utilization.
Browse files Browse the repository at this point in the history
When there are more than one ovs-vswitchd processes started,
only one process is enabled.  The disabled processes should
just sleep.  However, a bug in ovs makes the disabled processes
keep waking up on global connectivity sequence number which is
never sync'ed.  Consequently, those processes use 100% cpu.

This commit fixes the bug by always sync up the connectivity
sequence number for disabled processes.

Reported-by: Ben Pfaff <[email protected]>
Signed-off-by: Alex Wang <[email protected]>
Acked-by: Joe Stringer <[email protected]>
  • Loading branch information
yew011 committed Oct 1, 2014
1 parent d7fdacb commit 6bef3c7
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
37 changes: 37 additions & 0 deletions tests/ovs-vswitchd.at
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,40 @@ OVS_VSCTL_CHECK_RX_PKT([p1], [7])

OVS_VSWITCHD_STOP
AT_CLEANUP

dnl ----------------------------------------------------------------------
AT_SETUP([ovs-vswitchd -- start additional ovs-vswitchd process])
OVS_VSWITCHD_START

# start another ovs-vswitchd process.
ovs-vswitchd --log-file=fakelog &
pid=`echo $!`

# sleep for a while
sleep 5

# stop the process.
kill $pid

# check the fakelog, should only see one ERR for reporting
# the existing ovs-vswitchd process and one WARN for killing
# the process.
AT_CHECK([grep ERR fakelog | wc -l], [0], [dnl
1
])

AT_CHECK([grep WARN fakelog | wc -l], [0], [dnl
1
])

AT_CHECK([grep ERR fakelog | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl
another ovs-vswitchd process is running, disabling this process () until it goes away
])

# check the fakelog, the ERR log should be the last line.
AT_CHECK([tail -n 2 fakelog | head -n 1 | sed -e 's/^.*ERR|//; s/pid [[0-9]]*//'], [0], [dnl
another ovs-vswitchd process is running, disabling this process () until it goes away
])

OVS_VSWITCHD_STOP
AT_CLEANUP
3 changes: 3 additions & 0 deletions vswitchd/bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -2772,6 +2772,9 @@ bridge_run(void)
* with the current situation of multiple ovs-vswitchd daemons,
* disable system stats collection. */
system_stats_enable(false);
/* This prevents the process from constantly waking up on
* connectivity seq. */
connectivity_seqno = seq_read(connectivity_seq_get());
return;
} else if (!ovsdb_idl_has_lock(idl)) {
return;
Expand Down

0 comments on commit 6bef3c7

Please sign in to comment.