Virtual Memory Optimization is a feature in Presentation Server 4.0 and later. The following questions and answers explain the benefits and inner workings of the feature.
Q: What is Virtual Memory Optimization?
A: It is a feature designed to decrease Virtual Memory consumption of applications and improve application initialization time.
Q: What Editions of Presentation Server support Virtual Memory Optimization?
A: Presentation Server 4.0, 4.5, XenApp 5.0, and later, Platinum and Enterprise Editions with Platinum or Enterprise Edition license files on the license server.
Q: Why is Virtual Memory Optimization necessary?
A: DLLs are designed to be shared by all applications, so that only one instance of a DLL is needed in memory (RAM) regardless of how many applications are using that DLL. When an application initializes and loads its DLL into its view of memory (the virtual memory), there is a chance that the base memory address where it is attempting to load that DLL may already be occupied by another DLL. This event of attempting to load two DLLs at the same base memory address is called a collision. When a collision occurs, the DLL has to be relocated to an available base memory address. When this happens, the DLL can no longer be shared by other applications, and hence this takes up more actual memory, which also increases the amount of paging that the system must do and slows down overall performance. The loader then has to update all the hard-coded pointers in the DLL to reflect the new base address, which slows application load-time.
Q: What files and executables are used with Virtual Memory Optimization and where are they located?
A: All files related to this feature are located in Program Files\Citrix\Server Resource Management\Memory Optimization Management. Below is a description of these files:
CtxSFOsvc.exe - Monitors all DLLs on a server to find where collisions are occurring
CtxBace.exe - Optimizes the DLLs that are having trouble, by calculating a new base memory address and copying and changing the DLL to load at that address.
CtxTest.DLL - Responsible for testing all DLLs that have been modified to make sure that they still work
Repair.SFO - This is an XML file that has information about problematic DLLs found on a system that will be modified by the CtxBace.exe process.
Bind ####.SFO - Log files that list the DLLs that were optimized and how much virtual memory was saved because of the optimization
Q: How does Virtual Memory Optimization work?
Q: What is DLL Rebasing?
A: Rebasing changes a DLL so that it loads at an optimal base memory address to avoid collisions and relocations.
Q: What is Binding?
A: In order to explain what the Binding process does, here is a bit of background on how applications work. When an application initializes, the executable loads various DLLs that it needs at run-time. DLLs export functions that are made available to the application executable. However, in order for the executable to make use of a DLLs exported functions, it needs to look at the export table of that DLL to find the memory address where the functions are located.
The Binding process modifies the executable so that it has the memory address of these functions in advance. By having the address of these functions in advance, the executable does not have to read the DLLs export table. It just loads the DLL and goes directly to the memory address of that function at run-time.
Q: When does the actual optimization process occur?
A: The optimization occurs when the Ctxbace.exe process is running. That process can be seen in Task Manager. This process runs once when scheduled, then exits. It can be configured to run at a specified time in the Presentation Server Console under farm properties, Memory Optimization. By default the process is scheduled to run under the system account but it can be modified to run under another account in the Console.
Q: What is actually occurring during the optimization process?
A: After the Ctxbace.exe process reads the Repair.SFO file to see which DLLs to optimize, it makes a temporary copy of the DLL, calculates a potential safe base memory address, the CtxTestDLL program loads the new modified DLL to make sure it still works, then Ctxbace places the new modified DLL into an Alternate Data Stream of the original file. The original DLL is unchanged.
Q: What is the Repair.sfo file used for?
A: Repair.sfo is an XML file that is written-to by the Citrix Virtual Memory Optimization service (CtxSFOSvc.exe). This file contains a list of all .exes and DLLs that are to be optimized. It is located in [Program Files\Citrix\Server Resource Management\Memory Optimization Management\Data].
Q: What is an Alternate Data Stream?
A: They are hidden files that are attached to visible ones. The size of the original file stays the same; the only thing that changes is the modified date of the original file. The optimization process makes a copy of the original file, changes the base address on the copy and puts the modified copy into an Alternate Data Stream attached to the original file.
Q: How does the operating system determine whether to load the original file or the modified file located in the Alternate Data Stream?
A: There is a file filter driver that located in [Program Files\Citrix\Server Resource Management\Memory Optimization Management\System32\Drivers]. This file filter driver intercepts all calls to the file system. The driver checks to see if an Alternate Data Stream has been added to the file and if so it sends the alternate data stream back to the operating system.
Q: What if an application is affected by Virtual Memory Optimization?
A: If an application is not functioning correctly after being optimized by this feature it can be placed on the application exclusion list. The exclusion list is located in the Presentation Server Console under the farm properties in the Memory Optimization section. All applications placed on the exclusion list will be in the registry of each server under HKEY_LOCAL_MACHINE\ SOFTWARE\ Citrix\ SFO <ComponentExclusionList> or <ProcessExclusionList>. If you do not want to have the feature optimize a particular application it can also be placed on this list.
Note: DLL files added to the exclusion list using Citrix Management Console > Farm Properties > Memory Optimization are added to the ProcessExclusionList in the registry, but not the ComponentExclusionList. Therefore, the file is not excluded from memory optimization. Manually add the DLL’s to the ComponentExclusionList in the registry. Citrix may address this issue in a future release.
Q: Is there a list of applications that will not work with Virtual Memory Optimization?
A: While there may be other applications that do not work with this feature, the default exclusion list contains all known applications and DLLs that have been problematic in the past. This default exclusion list is in the registry location mentioned above.
Q: Are there types of applications that Virtual Memory Optimization is not designed to work with?
A: Yes. Applications that have digitally signed components, applications whose DLLs are protected by Windows Rights Management, and any application whose executable programmatically checks the DLL after it has been loaded.
Q: If I stop the Citrix Virtual Memory Optimization process, can that stop the optimization if it is has already begun?
A: No. This service is only monitoring the DLLs on the system and writing the name of the problematic .exe and DLL to the Repair.sfo file. Once they have been written to the Repair.sfo file when the Ctxbace.exe process runs it optimizes what is in the file. By stopping the service you are only stopping any future writes to the Repair.sfo file.
Q: How often should the optimization process run?
A: It is best to configure the optimization to run daily at an off peak time. You can configure this in the Presentation Server Console under Farm properties > Memory Optimization.
Q: Are there any log files that tell what DLLs or executables have been optimized?
A: Yes. After every optimization a log file is created that reports everything that was optimized or attempted to be optimized during the last optimization session. The file is called “Bind 38415.696366.SFO” and is located in [Program Files\Citrix\Server Resource Management\Memory Optimization Management\Data\Archive]. The logs allow an administrator to see for themselves how much savings each application or DLL gets them when it is rebased. There can be numerous log files created in this directory over time. They can be deleted or archived to another location to save disk space.
Q: Is the Citrix Virtual Memory Optimization service dependent on the IMA service?
A: The “Citrix Virtual Memory Optimization” is stopped and started by the IMA service. When looking at the properties of the service in the Services Manager you will see that it is set to manual because it is controlled by the IMA service. However if the IMA service fails to start, the “Citrix Virtual Memory Optimization” will not be automatically started either. The service can be manually started in the Services manager. If you restart the IMA service it will not restart the “Citrix Virtual Memory Optimization” service.
Q: How can you tell how much virtual memory has been saved by the Virtual Memory Optimization feature?
A: An administrator can use the Report Center in the Access Suite Console to create run a Virtual Memory Optimization report that details how much virtual memory has been saved by using this feature. This report does not require a connection to a summary database. It pulls its information from the Bind ######.sfo log files located in the \Archive directory.
CTX106699 – [Document Not Found]
CTX109222 – [Document Not Found]
CTX117669 – How to Disable the CtxAltStr.Sys Driver