Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 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)

      Code Block
      -- 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

Case Studies

  • Sometimes, external programs will make it look like Iguana is leaking memory.

    • 35814 - They had a monitoring program outside of Iguana that uses the Log API. It queried all the logs on an Iguana server, which cause memory to not get released properly. They now only query the last 12 hours.

    • 32422