[Fastboot] Delay LLDP service for better fastboot performance (#10568)
- Why I did it Profiling the system state on init after fast-reboot during create_switch function execution, it is possible to see few python scripts running at the same time. This parallel execution consume CPU time and the duration of create_switch is longer than it should be. Following this finding, and the motivation to ensure these services will not interfere in the future, LLDP is delayed in 90 seconds until the system finish the init flow after fastboot. - How I did it Add a timer for LLDP service. Copy the timer file to the host bin image. - How to verify it Run fast-reboot on MLNX platform and observe faster create_switch execution time. This PR is dependent on PR: #10567
This commit is contained in:
parent
bc30528341
commit
1d84e0d7df
@ -29,7 +29,7 @@
|
||||
},
|
||||
{%- set features = [("bgp", "enabled", false, "enabled"),
|
||||
("database", "always_enabled", false, "always_enabled"),
|
||||
("lldp", "enabled", false, "enabled"),
|
||||
("lldp", "enabled", true, "enabled"),
|
||||
("pmon", "enabled", false, "enabled"),
|
||||
("radv", "enabled", false, "enabled"),
|
||||
("snmp", "enabled", true, "enabled"),
|
||||
|
1
files/build_templates/lldp.timer.j2
Symbolic link
1
files/build_templates/lldp.timer.j2
Symbolic link
@ -0,0 +1 @@
|
||||
per_namespace/lldp.timer.j2
|
@ -20,6 +20,3 @@ ExecStartPre=/usr/local/bin/{{docker_container_name}}.sh start{% if multi_instan
|
||||
ExecStart=/usr/local/bin/{{docker_container_name}}.sh wait{% if multi_instance == 'true' %} %i{% endif %}
|
||||
ExecStop=/usr/local/bin/{{docker_container_name}}.sh stop{% if multi_instance == 'true' %} %i{% endif %}
|
||||
RestartSec=30
|
||||
|
||||
[Install]
|
||||
WantedBy=sonic.target
|
||||
|
12
files/build_templates/per_namespace/lldp.timer.j2
Normal file
12
files/build_templates/per_namespace/lldp.timer.j2
Normal file
@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
# This delay is for fast/warm reboot performance
|
||||
Description=Delays LLDP docker until SONiC has started
|
||||
PartOf=lldp{% if multi_instance == 'true' %}@%i{% endif %}.service
|
||||
|
||||
[Timer]
|
||||
OnUnitActiveSec=0 sec
|
||||
OnBootSec=1min 30 sec
|
||||
Unit=lldp{% if multi_instance == 'true' %}@%i{% endif %}.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target sonic.target sonic-delayed.target
|
@ -774,6 +774,19 @@ if [ -f {{service}} ]; then
|
||||
echo "{{service}}" | sudo tee -a $GENERATED_SERVICE_FILE
|
||||
fi
|
||||
{% endfor %}
|
||||
{% for timer in installer_timers.split(' ') -%}
|
||||
if [ -f {{timer}} ]; then
|
||||
sudo cp {{timer}} $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM
|
||||
|
||||
{% if "@" in timer %}
|
||||
MULTI_INSTANCE="{{timer}}"
|
||||
SINGLE_INSTANCE=${MULTI_INSTANCE/"@"}
|
||||
sudo cp $SINGLE_INSTANCE $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM
|
||||
{% endif %}
|
||||
|
||||
echo "{{timer}}" | sudo tee -a $GENERATED_SERVICE_FILE
|
||||
fi
|
||||
{% endfor %}
|
||||
if [ -f iccpd.service ]; then
|
||||
sudo LANG=C chroot $FILESYSTEM_ROOT systemctl disable iccpd.service
|
||||
fi
|
||||
|
@ -50,6 +50,13 @@ function waitplatform() {
|
||||
/bin/systemctl start pmon
|
||||
debug "Started pmon service"
|
||||
fi
|
||||
if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then
|
||||
debug "LLDP service is delayed by a timer for better fast/warm boot performance"
|
||||
else
|
||||
debug "Starting lldp service..."
|
||||
/bin/systemctl start lldp
|
||||
debug "Started lldp service"
|
||||
fi
|
||||
}
|
||||
|
||||
function stopplatform1() {
|
||||
|
31
slave.mk
31
slave.mk
@ -1162,6 +1162,14 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
|
||||
$(eval $(docker:-dbg.gz=.gz)_GLOBAL = yes)
|
||||
)
|
||||
fi
|
||||
if [ -f files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 ]; then
|
||||
j2 files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer
|
||||
|
||||
# Set the flag GLOBAL_TIMER for all the global system-wide dockers timers.
|
||||
$(if $(shell ls files/build_templates/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 2>/dev/null),\
|
||||
$(eval $(docker:-dbg.gz=.gz)_GLOBAL_TIMER = yes)
|
||||
)
|
||||
fi
|
||||
# Any service template, inside instance directory, will be used to generate .service and @.service file.
|
||||
if [ -f files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 ]; then
|
||||
export multi_instance="true"
|
||||
@ -1172,6 +1180,16 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
|
||||
export multi_instance="false"
|
||||
j2 files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service
|
||||
fi
|
||||
# Any timer template, inside instance directory, will be used to generate .timer and @.timer file.
|
||||
if [ -f files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 ]; then
|
||||
export multi_instance="true"
|
||||
j2 files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME)@.timer
|
||||
$(if $(shell ls files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 2>/dev/null),\
|
||||
$(eval $(docker:-dbg.gz=.gz)_TEMPLATE_TIMER = yes)
|
||||
)
|
||||
export multi_instance="false"
|
||||
j2 files/build_templates/per_namespace/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer.j2 > $($(docker:-dbg.gz=.gz)_CONTAINER_NAME).timer
|
||||
fi
|
||||
# Any service template, inside share_image directory, will be used to generate -chassis.service file.
|
||||
# TODO: need better way to name the image-shared service
|
||||
if [ -f files/build_templates/share_image/$($(docker:-dbg.gz=.gz)_CONTAINER_NAME).service.j2 ]; then
|
||||
@ -1209,7 +1227,20 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
|
||||
$(eval SERVICES += "$(addsuffix -chassis.service, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))")
|
||||
)
|
||||
)
|
||||
# Marks template timers with an "@" according to systemd convention
|
||||
# If the $($docker)_TEMPLATE_TIMER) variable is set, the timer will be treated as a template
|
||||
# If the $($docker)_GLOBAL_TIMER) and $($docker)_TEMPLATE_TIMER) variables are set the timer will be added both as a global and template timer.
|
||||
$(foreach docker, $($*_DOCKERS),\
|
||||
$(if $($(docker:-dbg.gz=.gz)_TEMPLATE_TIMER),\
|
||||
$(if $($(docker:-dbg.gz=.gz)_GLOBAL_TIMER),\
|
||||
$(eval TIMERS += "$(addsuffix .timer, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))")\
|
||||
)\
|
||||
$(eval TIMERS += "$(addsuffix @.timer, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))"),\
|
||||
$(eval TIMERS += "$(addsuffix .timer, $($(docker:-dbg.gz=.gz)_CONTAINER_NAME))")
|
||||
)
|
||||
)
|
||||
export installer_services="$(SERVICES)"
|
||||
export installer_timers="$(TIMERS)"
|
||||
|
||||
export installer_extra_files="$(foreach docker, $($*_DOCKERS), $(foreach file, $($(docker:-dbg.gz=.gz)_BASE_IMAGE_FILES), $($(docker:-dbg.gz=.gz)_PATH)/base_image_files/$(file)))"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user