/
Memory Leaks

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

Related content

Iguana Common Errors
Iguana Common Errors
More like this
Node.lua Crash
Node.lua Crash
Read with this
Best Practices & Memory crash Prevention
Best Practices & Memory crash Prevention
More like this
Out of Disk Crash
Out of Disk Crash
Read with this
Memory Crash
Memory Crash
More like this
Logs Locked Crash
Logs Locked Crash
Read with this