Memory Leaks

Issue

  • The Iguana service is leaking memory overtime

  • This can be seen in Windows task manager - Iguana memory increasing

  • This leads to a crash, the crashdumps often have 0 bytes, crash-failure.txt, or failed to create (ran out of memory while creating the file), nothing meaningful in the ServiceErrorLog usually

  • In Windows Event Viewer, an error such as “low virtual memory condition”

Cause

  • Most often, there is a memory leak in a channel

  • There could be another process leaking memory and making it look like Iguana is leaking memory

  • RAM too small

Possible Solutions

  • https://help.interfaceware.com/v6/how-to-troubleshoot-iguana-memory-leak

  • Find the channel leaking memory then do a code review

  • You can use the checkMemory.lua script developed by Paul Le to find a channel leaking memory over time.

    • The client would need to add this module in the shared folder, add a require statement in their main.lua, and call checkMemory() in the main function.

    • All of their channels need this script and the client needs to run the channels as normal to simulate the traffic when the memory leak occurred

    • An error should show in the Iguana logs for the leaking channel

    • If no leak is found, try decreasing the variable memoryBuffer (This is the case if the leak is small)

      -- Keep track of last memory usage and how many times memory has increased memoryUsage = { ['lastMemoryUsage'] = 0, ['increasedMemoryCount'] = 0 } isTriggered = false local memoryLeakThreshold = 20 -- How many times memory increases to trigger an alert local memoryBuffer = 10 -- Buffer for what is inconsidered a memory increase -- Useful information on how Lua handles memory: -- https://www.lua.org/pil/17.html function checkMemory() -- Trigger garbage collection to clear unreferenced memory collectgarbage('collect') -- Get referenced memory usage local memoryUsageCount = collectgarbage('count') iguana.logDebug('Total memory in use by Lua (in Kbytes): ' .. memoryUsageCount) -- Check if the memory is increasing even after garbage is collected if memoryUsageCount - memoryBuffer > memoryUsage.lastMemoryUsage then iguana.logDebug('Memory in use by Lua increased (in Kbytes) by: ' .. memoryUsageCount - memoryUsage.lastMemoryUsage) iguana.logDebug('Total memory in use by Lua (in Kbytes): ' .. memoryUsageCount) -- Increase count for increasing memory usage memoryUsage.increasedMemoryCount = memoryUsage.increasedMemoryCount + 1 -- Set last memory usage to the current memory usage count memoryUsage.lastMemoryUsage = memoryUsageCount elseif memoryUsageCount < memoryUsage.lastMemoryUsage then -- Reset memory increase count if memory decreases memoryUsage.increasedMemoryCount = 0 end -- If memory is increasing consistently then flag potential memory leak if memoryUsage.increasedMemoryCount > memoryLeakThreshold and not isTriggered then iguana.logError('There may be a memory leak!') iguana.logError('Total memory in use by Lua (in Kbytes): ' .. memoryUsageCount) isTriggered = true end end