9 Tuning Workload Memory Protection #
   If you have systemd-based SAP instances, read
   Section 9.9, “Systems running both systemd-based and regular SAP instances” and
   Section 9.10, “Systems running only systemd-based instances” before setting up Workload Memory Protection.
  
Keeping SAP applications in physical memory is essential for their performance. In older product versions, the Page Cache Limit prevented a swap out to disk by a growing page cache (in SUSE Linux Enterprise Server for SAP applications 11 SP1 onwards and in SUSE Linux Enterprise Server for SAP applications 12). In SUSE Linux Enterprise Server for SAP applications 15, the Page Cache Limit has been replaced by the more advanced Workload Memory Protection.
  Workload Memory Protection puts SAP instances into a dedicated cgroup (v2) and tells the kernel,
  by the memory.low parameter, the amount of memory to keep
  in physical memory. This protects the processes in this cgroup against any
  form of memory pressure outside that cgroup, including a growing page cache.
  Workload Memory Protection cannot protect against memory pressure inside this cgroup. It covers
  the memory of all instances together on one host.
 
  The value for memory.low depends on the kind of SAP
  instance and the workload and needs to be configured manually. If the system
  is under extreme pressure, the Linux kernel will ignore the
  memory.low value and try to stabilize the whole system,
  even by swapping or invoking the OOM killer.
 
For more information about cgroups, see https://documentation.suse.com/sles-15/html/SLES-all/cha-tuning-cgroups.html.
9.1 Architecture #
WMP relies on three components:
- cgroup2 memory controller (Linux kernel)
- The cgroup2 memory controller parameter memory.low allows defining an amount of memory, which the Linux kernel will keep in physical memory. This amount of memory will be excluded from the reclaiming process unless the entire system is in a critical memory situation. - WMP uses memory.low to prevent memory from SAP processes from being paged or swapped out to disk. Apart from the memory controller, cgroup1 controllers are still available, but are not mounted any more. 
- systemd
- systemdprovides the infrastructure to create and maintain the cgroup hierarchy and allows the configuration of cgroup parameters. WMP ships- systemdconfiguration files to allow easy configuration of memory.low via- systemdmethods.
- SAP start service
- The SAP start service manages the starting and stopping of SAP instances. An important feature for WMP is the configurable execution of programs before the instance itself gets started in the instance profile. WMP uses this method to call a program to move the - sapstartprocess into a designated cgroup, so the SAP instance will be started inside that cgroup.
9.2 Support for Workload Memory Protection #
WMP is supported for SUSE Linux Enterprise Server for SAP applications 15 SP4 on AMD64/Intel 64 and POWER for one or multiple SAP systems on one host, such as:
- App Server (SAP NetWeaver, SAP S/4HANA) or 
- SAP HANA 1.0/2.0 
   Workload Memory Protection does not cover databases other than SAP HANA. Depending on their start
   method, the processes might run inside or outside the dedicated cgroup. If
   they run inside, the memory consumption needs to be taken into account when
   determining memory.low.
  
Using WMP comes with benefits, but you should be aware of some restrictions:
- WMP cannot protect against memory pressure inside the dedicated cgroup. 
- WMP cannot protect SAP systems or their instances from each other. All SAP processes share the same memory limit. If you have multiple SAP systems (for example, SAP NetWeaver and SAP S/4HANA), WMP cannot shield one SAP application from the other. 
- Support for SUSE’s HA cluster solution is not yet available. 
9.3 Setting up Workload Memory Protection #
9.3.1 Preparing for Workload Memory Protection #
- Check if your SAP software (SAP HANA, SAP NetWeaver etc) is installed. The group - sapsysis needed during the package installation of sapwmp later. If you skip that part, you will get a warning message (see Important: Watch out for order of packages).
- Stop the SAP system: - #- systemctlstop sapinit- The service can be enabled, but all SAP processes need to be terminated. 
- Install the package sapwmp: - >- sudo- zypperinstall sapwmpImportant: Watch out for order of packages- The following message should only appear if no SAP software has been installed on the system: - Warning: sapsys group not found warning: group sapsys does not exist - using root - Remove the package sapwmp and install the SAP software first before installing sapwmp again. - As an alternative, you can fix ownership and permission after installing the SAP software with: - >- sudo- chgrpsapsys /usr/lib/sapwmp/sapwmp-capture && \ chmod +s /usr/lib/sapwmp/sapwmp-capture- The following message can be ignored: - Warning: Found memory controller on v1 hierarchy. Make sure unified hierarchy only is used. - Switching to unified hierarchy is done in the next step. 
- Add - systemd.unified_cgroup_hierarchy=trueto the kernel command line by adding it to- GRUB_CMDLINE_LINUX_DEFAULTin- /etc/default/grublike:- GRUB_CMDLINE_LINUX_DEFAULT="... systemd.unified_cgroup_hierarchy=true swapaccount=1" - With this change, only cgroup2 controllers will be mounted on - /sys/fs/cgroup. Cgroup1 controllers, except the memory controller, are still available and can be used though. Tools using cgroup1 might not work out of the box any more and might need reconfiguration. Also, the required mount structure for cgroup1 needs to be provided.- The parameter - swapaccount=1is not needed for WMP to work, but it aids the analysis in support cases to show the amount of swapped out memory for each cgroup.
- Rewrite the GRUB2 configuration: - >- sudo- grub2-mkconfig-o /boot/grub2/grub.cfg- After reboot (will be done later), the cgroup hierarchy is switched to v2 (unified hierarchy) only. 
- Configure - MemoryLowfor the- SAP.slice:- >- sudo- systemctlset-property SAP.slice MemoryLow=...- This command creates a drop-in in - /etc/systemd/system.control/SAP.slice.d/to set- MemoryLow.- The sapwmp package includes the - systemdconfiguration- SAP.slicewhich creates the cgroup of the same name for the SAP instances.- MemoryLowis the- systemdequivalent of the cgroup parameter- memory.lowmentioned in the introduction. The value for- MemoryLowdepends on the type of the SAP application and the workload.- For SAP HANA
- Since SAP HANA has a Global Allocation Limit, its value can be used directly. 
- SAP Application Server (SAP NetWeaver, SAP S/4HANA)
- For the Application Server, the sizing for the workload should indicate the value for - MemoryLow. The sapwmp package contains a monitoring part which might be useful to determine- MemoryLow. See Section 9.6, “Monitoring memory usage”.
 - Keep in mind: - All SAP instances on one host are inside the - SAP.slice.- MemoryLowmust cover the amount of memory of all instances together on that host. You cannot protect SAP systems or their instances from each other.
- If you are using a database other than SAP HANA, some database processes might be part of - SAP.slice. Their memory consumption needs to be taken into account when determining the- MemoryLowvalue.
- Never choose a value for - MemoryLowvery close to or larger than your physical memory. System services and additional installed software require memory too. If they are forced to use swap too extensively, at the expense of the SAP application, your system can become unresponsive.
 Note: Correctly calculate- MemoryLowvalue- MemoryLowtakes the memory size in bytes. If the value is suffixed with K, M, G, or T, the specified memory size is parsed as Kibibytes, Mebibytes, Gibibytes, or Tebibytes (with the base 1024 instead of 1000, see https://en.wikipedia.org/wiki/Binary_prefix), respectively. Alternatively, a percentage value may be specified, which is taken relative to the installed physical memory on the system.- The underlying cgroup memory controller will round up the value to a multiple of the page size. To avoid confusion, set the value for - MemoryLowto a multiple of the page size.
- Create a backup of each SAP instance profile. Errors in a profile can prevent a SAP system from starting. 
- For each SAP instance, add the following line to the instance profile (usually located in - /usr/sap/SID/SYS/profile/) after the last- Execute_line:- Execute_20 = local /usr/lib/sapwmp/sapwmp-capture -a - If necessary, increase the number of the Execute statement so that it is the highest one, which means that that line is executed last. Important: Editing instance profiles- Edit the instance profiles directly only if you do not have the profiles imported into the database to manage them via the SAP GUI (transaction RZ11). If you have imported them, use the SAP GUI to add the lines. Profile files located in the file system are overwritten and any manual changes would be lost! 
Now the system is ready for a reboot.
9.3.2 Reboot and verification #
- Reboot the system. 
- After rebooting, verify that cgroups v2 has indeed been used: - #- grepcgroup /proc/mounts cgroup /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime 0 0
- Verify that the cgroup was created successfully and the low memory value has been set: - >- systemctlshow -p MemoryLow SAP.slice MemoryLow=18487889920 <- Should be your chosen value (always in bytes)! # cat /sys/fs/cgroup/SAP.slice/memory.low 18487889920 <- Should be your chosen value!- The variable - MemoryLowcan be set to any value, but the content of the variable is always a multiple of the page size. Keep this in mind if you notice a slight difference between the values.
- Check that all SAP instance processes are in the correct system slices/cgroup. - If you have not enabled - sapinit.servicestart the service now. If autostart is not enabled in the instance profiles, start the instances before you check.- Example: - #- systemd-cgls-a /sys/fs/cgroup/SAP.slice Directory /sys/fs/cgroup/SAP.slice: |-wmp-rd91fd6b3ca0d4c1183659ef4f9a092fa.scope | |-3349 sapstart pf=/usr/sap/HA0/ERS10/profile/HA0_ERS10_sapha0er | `-3375 er.sapHA0_ERS10 pf=/usr/sap/HA0/ERS10/profile/HA0_ERS10_sapha0er N... |-wmp-r360ebfe09bcd4df4873ef69898576199.scope | |-3572 sapstart pf=/usr/sap/HA0/SYS/profile/HA0_D01_sapha0ci | |-3624 dw.sapHA0_D01 pf=/usr/sap/HA0/SYS/profile/HA0_D01_sapha0ci ...- The - sapstartsrvprocess of an instance always remains in the user slice of- SIDadm. Only the- sapstartprocess and its children will be moved to the target cgroup.- For each instance, a directory - wmp-rSCOPEID.scopeexists with all processes of this instance. The SCOPEID is a random 128-bit value in hexadecimal.- The SAP HostAgent is not covered by WMP and remains partly in - sapinit.sliceand partly in the user slice of- sapadm.
- If the processes are not in the cgroup, check if the - Executelines in the instance profiles are correct. Also each instance start should now be logged in the system log- /var/log/messages:- ... 2020-06-16T18:41:28.317233+02:00 server-03 sapwmp-capture: Found PIDs: 2020-06-16T18:41:28.317624+02:00 server-03 sapwmp-capture: 17001 2020-06-16T18:41:28.317813+02:00 server-03 sapwmp-capture: 16994 2020-06-16T18:41:28.317959+02:00 server-03 sapwmp-capture: 16551 2020-06-16T18:41:28.319423+02:00 server-03 sapwmp-capture: Successful capture into SAP.slice/wmp-r07a27e12d7f2491f8ccb9aeb0e080aaa.scope 2020-06-16T18:41:28.319672+02:00 server-03 systemd[1]: Started wmp-r07a27e12d7f2491f8ccb9aeb0e080aaa.scope. ... 
    To verify the correct setup, run wmp-check. The script
    checks the setup of Workload Memory Protection:
   
- Correct setup of cgroup2. 
- Ownership and permission of the capture program. 
- WMP entries of SAP instance profiles. 
- Correct cgrop of running SAP instance processes. 
- Correct setup of - SAP.slice.
- Sane configuration of MemoryLow. However, it cannot determine if the MemoryLow value has been chosen wisely. 
- Setup of the optional memory sampler. 
- Setup of optional swap accounting. 
    It assumes SAP instances profiles can be found beneath
    /usr/sap/SID/SYS/profile/.
   
9.4 Configuring Workload Memory Protection #
   To configure WMP, edit /etc/sapwmp.conf:
  
# NOTE: Local changes may be reverted after update of WMP package. Check for # .rpmsave file to restore & merge changes. ## Description: Slice unit name where workload is put into ## Type: string ## Default: "SAP.slice" DEFAULT_SLICE="SAP.slice" ## Description: Comma-separated list of command names to which capture is ## applied (matching against /proc/$PID/stat) ## Type: string ## Default: sapstart PARENT_COMMANDS=sapstart
After any change, restart all SAP instances.
    Altering /etc/sapwmp.conf should not be necessary. Do
    not do it until you know exactly what you are doing!
   
9.5 Changing the value of MemoryLow #
   To change the value of MemoryLow run:
  
#systemctlset-property SAP.slice MemoryLow=...
The changes will take effect immediately.
   The underlying cgroup memory controller will round up the value to a
   multiple of the page size. To avoid confusion, set the value of
   MemoryLow to a multiple of the page size.
  
MemoryLow
    Never set MemoryLow to a value lower than the memory
    already accounted in SAP.slice. To check, run:
   
#systemctlshow -p MemoryCurrent SAP.slice
9.6 Monitoring memory usage #
   Logging the memory usage can be necessary not only to determine the value
   for memory.low, but also for monitoring the correct
   operation of WMP.
  
To enable monitoring, activate the shipped timer unit:
#systemctlenable --now wmp-sample-memory.timer
   Now the timer should be listed by systemctl list-timers:
  
#systemctllist-timers NEXT LEFT LAST PASSED UNIT ACTIVATES ... Tue... 9min left Tue... 4s ago wmp-sample-memory.timer wmp-sample-memory.service ...
If you check the current configuration, you can see that memory data is collected every 10 minutes with a randomized delay of three minutes:
#systemctlcat wmp-sample-memory.timer # /usr/lib/systemd/system/wmp-sample-memory.timer [Unit] Description=WMP periodic log of memory consumption [Timer] OnCalendar=*:0/10 RandomizedDelaySec=180 AccuracySec=60 [Install] WantedBy=timers.target
   To change this, create a drop-in file and reload systemd (for example, by
   increasing the interval to 30 minutes):
  
#mkdir/etc/systemd/system/wmp-sample-memory.timer.d # cat <<EOF >/etc/systemd/system/wmp-sample-memory.timer.d/override.conf [Timer] OnCalendar= OnCalendar=*:0/30 EOF # systemctl daemon-reload
(The first OnCalendar= line is important for deleting previously defined OnCalendar= settings.)
   To see the memory consumption, check the system log for lines written by
   wmp_memory_current:
  
#grepwmp_memory_current /var/log/messages ... 2020-09-14T12:02:40.337266+02:00 server-03 wmp_memory_current: SAP.slice : memory.low=21474836480 memory.current=2294059008 memory.swap.current=0 , user.slice : memory.low=0 memory.current=5499219968 memory.swap.current=0 , init.scope : memory.low=0 memory.current=8364032 memory.swap.current=0 , system.slice : memory.low=0 memory.current=1863335936 memory.swap.current=0 2020-09-14T12:03:00.767838+02:00 server-03 wmp_memory_current: SAP.slice : memory.low=21474836480 memory.current=2294022144 memory.swap.current=0 , user.slice : memory.low=0 memory.current=5499473920 memory.swap.current=0 , init.scope : memory.low=0 memory.current=8364032 memory.swap.current=0 , system.slice : memory.low=0 memory.current=1862586368 memory.swap.current=0 2020-09-14T12:04:00.337315+02:00 server-03 wmp_memory_current: SAP.slice : memory.low=21474836480 memory.current=2294022144 memory.swap.current=0 , user.slice : memory.low=0 memory.current=5499207680 memory.swap.current=0 , init.scope : memory.low=0 memory.current=8355840 memory.swap.current=0 , system.slice : memory.low=0 memory.current=1862746112 memory.swap.current=0 ...
Here is a reformatted log line to get a better impression:
2020-09-14T12:02:40.337266+02:00 server-03 wmp_memory_current: SAP.slice : memory.low=21474836480 memory.current=2294059008 memory.swap.current=0 , user.slice : memory.low=0 memory.current=5499219968 memory.swap.current=0 , init.scope : memory.low=0 memory.current=8364032 memory.swap.current=0 , system.slice : memory.low=0 memory.current=1863335936 memory.swap.current=0
   For each cgroup directly below /sys/fs/cgroup/ one
   comma-separated block exists. On a normal system, you should find at least
   user.slice, system.slice,
   and init.scope. WMP adds
   SAP.slice.
  
   Each block contains the information about the current value of
   memory.low and memory.current, and the
   currently allocated amount of physical memory of processes in this cgroup.
  
   If you enabled swap accounting (swapaccount=1) during
   setup, you also have memory.swap.current, the amount of
   swapped-out memory of the cgroup.
  
All values are in bytes. See Step 6 in Section 9.3.1, “Preparing for Workload Memory Protection”.
You can find a script to print the information as table or CSV here: https://github.com/scmschmidt/wmp_log_extract
9.7 Verifying correct operation #
   Besides monitoring memory consumption and swapping (see
   Section 9.6, “Monitoring memory usage”), you
   should also regularly check that all SAP instance processes are in their
   scopes below SAP.slice.
  
   To do so, run systemd-cgls and check each instance
   process.
  
Example:
#systemd-cgls-a /sys/fs/cgroup/SAP.slice Directory /sys/fs/cgroup/SAP.slice: |-wmp-rd91fd6b3ca0d4c1183659ef4f9a092fa.scope | |-3349 sapstart pf=/usr/sap/HA0/ERS10/profile/HA0_ERS10_sapha0er | `-3375 er.sapHA0_ERS10 pf=/usr/sap/HA0/ERS10/profile/HA0_ERS10_sapha0er N... |-wmp-r360ebfe09bcd4df4873ef69898576199.scope | |-3572 sapstart pf=/usr/sap/HA0/SYS/profile/HA0_D01_sapha0ci | |-3624 dw.sapHA0_D01 pf=/usr/sap/HA0/SYS/profile/HA0_D01_sapha0ci ...
   A simpler test would be to list all processes, including cgroups, for all
   SIDs used on the system.
  
Example:
>ps-eo user,pid,cgroup:60,args |grep-e [h]a0adm ha0adm 2062 0::/user.slice/user-1001.slice/user@1001.service/init.scope /usr/lib/systemd/systemd --user ha0adm 2065 0::/user.slice/user-1001.slice/user@1001.service/init.scope (sd-pam) ha0adm 3081 0::/SAP.slice/wmp-r73c594e050904c9c922a312dd9a28fd4.scope sapstart pf=/usr/sap/HA0/SYS/profile/HA0_ASCS00_sapha0as ha0adm 3133 0::/SAP.slice/wmp-r73c594e050904c9c922a312dd9a28fd4.scope ms.sapHA0_ASCS00 pf=/usr/sap/HA0/SYS/profile/HA0_ASCS00_sapha0as ha0adm 3134 0::/SAP.slice/wmp-r73c594e050904c9c922a312dd9a28fd4.scope en.sapHA0_ASCS00 pf=/usr/sap/HA0/SYS/profile/HA0_ASCS00_sapha0as ha0adm 3327 0::/SAP.slice/wmp-ra42489517eb846c282c57681e627a496.scope sapstart pf=/usr/sap/HA0/ERS10/profile/HA0_ERS10_sapha0er ...
   All instance processes except sapstartsrv need to
   be in a scope below 0::/SAP.slice/.
  
   To verify the correct setup, use the wmp-check tool. See
   Section 9.3.2, “Reboot and verification” for more
   details.
  
9.8 Uninstalling Workload Memory Protection #
- Stop the SAP system completely. The - sapinit.servicehas to be stopped, but can stay enabled. All SAP processes have to be terminated.
- Remove any changes made to - SAP.slice, such as setting- MemoryLow:- #- systemctlrevert SAP.slice
- (Optional) Remove the package sapwmp: - #- zypperremove sapwmp- This step is optional. The package can stay on the system without having an influence. 
- (Optional) Remove - systemd.unified_cgroup_hierarchy=truefrom- GRUB_CMDLINE_LINUX_DEFAULTin- /etc/default/grub.- This step is optional. You can keep cgroup2 without using WMP. 
- Rewrite the GRUB2 configuration: - #- grub2-mkconfig-o /boot/grub2/grub.cfg- After the next boot, the system is switched back to the hybrid cgroup hierarchy. 
- Remove the line to call sapwmp-capture from each SAP instance profile (usually located in - /usr/sap/SID/SYS/profile/):- Execute_20 = local /usr/lib/sapwmp/sapwmp-capture -a Important: Backup is necessary- Before editing an instance profile, create a backup! Errors in a profile can prevent an SAP system from starting! Important: About editing profiles directly- Edit the instance profiles directly only if you have not imported the profiles into the database to manage them via the SAP GUI (transaction RZ11). If you have imported them, use the SAP GUI to add the lines. Profile files located in the file system are overwritten, and any manual changes will be lost! 
- Reboot the system and verify that your SAP system has been started successfully. 
9.9 Systems running both systemd-based and regular SAP instances #
   With SAP kernel version 788 and certain specified patch levels of older
   kernel releases (722, 753, 777, 781, 785), the SAP Start Service supports
   systemd. Such a systemd-based instance comes with its own systemd
   service that the SAP Start Service places into its own cgroup (SAPSID_NR.service)
   under SAP.slice. This affects the
   Workload Memory Protection setup. For systemd-based SAP instances, the following instructions
   apply:
  
- Skip the step that adds the capture program to the instance profile. If you are migrating an instance to support - systemd, remove this entry from the profile. Keep in mind that- systemd-based instances are always put into a cgroup under- SAP.sliceand therefore become part of Workload Memory Protection protection.
- Set - MemoryLow=infinityfor the- SAPSID_NR.serviceto make the protection work correctly. Example for- SAPNW1_01.service:- sudo systemctl set-property SAPNW1_01.service MemoryLow=infinity 
- Set - MemoryLow=infinityfor the- saphostagent.serviceto make the protection work correctly- sudo systemctl set-property saphostagent.service MemoryLow=infinity 
   The following example demonstrates a mixed environment. The SAP Host Agent
   and instance 01 are systemd-based, instance 00 is not. Both instances are
   under SAP.slice either in the
   cgroup managed by the SAP Start Service
   (SAPNW1_01.service) or Workload Memory Protection
   (wmp-rece5b7fa372e4619a9623e120aa23a23.scope).
   MemoryLow= for
   SAP.slice has been set as well as
   MemoryLow=infinity for all the cgroups below.
  
>systemd-cgls Control group /: -.slice ├─SAP.slice │ ├─SAPNW1_01.service │ │ ├─ 887 /usr/sap/NW1/ASCS01/exe/sapstartsrv pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ │ ├─2838 sapstart pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ │ ├─2895 ms.sapNW1_ASCS01 pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ │ └─2896 en.sapNW1_ASCS01 pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ ├─saphostagent.service │ │ ├─ 900 /usr/sap/hostctrl/exe/saphostexec pf=/usr/sap/hostctrl/exe/host_profile -nodaemon -trace │ │ ├─ 984 /usr/sap/hostctrl/exe/sapstartsrv pf=/usr/sap/hostctrl/exe/host_profile │ │ └─2428 /usr/sap/hostctrl/exe/saposcol -l -w60 pf=/usr/sap/hostctrl/exe/host_profile │ └─wmp-rece5b7fa372e4619a9623e120aa23a23.scope │ ├─5522 sapstart pf=/usr/sap/NW1/SYS/profile/NW1_D00_systemdproj │ ├─7824 dw.sapNW1_D00 pf=/usr/sap/NW1/SYS/profile/NW1_D00_systemdproj │ ├─7825 ig.sapNW1_D00 -mode=profile pf=/usr/sap/NW1/SYS/profile/NW1_D00_systemdproj ...>systemctl show -p MemoryLow SAP.slice MemoryLow=24584065024>systemctl show -p MemoryLow wmp-rece5b7fa372e4619a9623e120aa23a23.scope MemoryLow=infinity>systemctl show -p MemoryLow SAPNW1_01.service MemoryLow=infinity>systemctl show -p MemoryLow saphostagent.service MemoryLow=infinity
   Further information about the systemd integration is available at
   SAP
   Note 139184 - Linux: systemd integration for sapstartsrv and SAP Host
   Agent.
  
9.10 Systems running only systemd-based instances #
    SUSE's HA cluster solutions are supported for fully systemd-based SAP
    systems.
   
   An SAP system consisting of systemd-based instances can only rely on
   cgroup2 for memory protection.
  
   The instances are placed into a dedicated cgroup (default is
   SAP.slice) by the SAP Start
   Service. Therefore it is only necessary to switch to the unified cgroup2
   hierarchy and set MemoryLow= correctly.
  
   If Workload Memory Protection is already configured, follow the instructions in
   Section 9.9, “Systems running both systemd-based and regular SAP instances”. Afterwards, you can remove the
   package sapwmp from the system, unless you want to use
   the wmp-sample-memory.timer and
   wmp-sample-memory.service to
   monitor memory usage.
  
   To configure the memory protection for a system consisting of only
   systemd-based SAP instances, perform the following steps:
  
- Stop all SAP instances and the SAP Host Agent. 
- Switch to the unified cgroup hierarchy, rewrite the boot loader (step 4 and 5 in Section 9.3.1, “Preparing for Workload Memory Protection”). 
- Set - MemoryLow=for- SAP.slice(step 6 in Section 9.3.1, “Preparing for Workload Memory Protection”).
- Set - MemoryLow=infinityfor- saphostagent.serviceand for the services of all SAP instances.
- Reboot the system. 
   The following example demonstrates a systemd-based environment. The SAP
   Host Agent and all instances are in their cgroups under
   SAP.slice.
   MemoryLow= for
   SAP.slice has been set as well as
   MemoryLow=infinity for all the cgroups below.
  
>systemd-cgls Control group /: -.slice ├─SAP.slice │ ├─SAPNW1_00.service │ │ ├─5522 sapstart pf=/usr/sap/NW1/SYS/profile/NW1_D00_systemdproj │ │ ├─7824 dw.sapNW1_D00 pf=/usr/sap/NW1/SYS/profile/NW1_D00_systemdproj │ │ ├─7825 ig.sapNW1_D00 -mode=profile pf=/usr/sap/NW1/SYS/profile/NW1_D00_systemdproj ... │ ├─SAPNW1_01.service │ │ ├─ 887 /usr/sap/NW1/ASCS01/exe/sapstartsrv pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ │ ├─2838 sapstart pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ │ ├─2895 ms.sapNW1_ASCS01 pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ │ └─2896 en.sapNW1_ASCS01 pf=/usr/sap/NW1/SYS/profile/NW1_ASCS01_systemdproj │ └─saphostagent.service │ ├─ 900 /usr/sap/hostctrl/exe/saphostexec pf=/usr/sap/hostctrl/exe/host_profile -nodaemon -trace │ ├─ 984 /usr/sap/hostctrl/exe/sapstartsrv pf=/usr/sap/hostctrl/exe/host_profile │ └─2428 /usr/sap/hostctrl/exe/saposcol -l -w60 pf=/usr/sap/hostctrl/exe/host_profile ...>systemctl show -p MemoryLow SAP.slice MemoryLow=24584065024>systemctl show -p MemoryLow wmp-rece5b7fa372e4619a9623e120aa23a23.scope MemoryLow=infinity>systemctl show -p MemoryLow SAPNW1_01.service MemoryLow=infinity>systemctl show -p MemoryLow saphostagent.service MemoryLow=infinity