Tweaking IO Memory Allocation

By stretch | Monday, December 7, 2009 at 5:06 a.m. UTC

Recently I upgraded all of the community lab 1841 routers to 256 MB of DRAM. In doing so, I noticed something I hadn't before: the percentage of dynamic memory (DRAM) allocated to input/output (IO) memory seemed to vary among different revisions of hardware, even when they had the same modules and total amount of DRAM. This can lead to unexpected issues when implementing memory-intensive features, as was encountered by at least one lab user.

To inspect the amount of memory installed in a Cisco router, look for this line toward the bottom of the show version output:

Router# show version
Cisco 1841 (revision 6.0) with 239616K/22528K bytes of memory.

The first number is the amount of memory available to software processes, or process memory. The second number is the remaining amount, which has been allocated for IO memory (interface buffers). Adding the two numbers returns the total amount of DRAM installed:

  • 239616 KB + 22528 KB = 262144 KB
  • 262144 KB / 1024 = 256 MB

If you encounter a router which seems to have a disproportionately large or small IO memory allocation, the memory-size iomem command can be used to modify it as a percentage between 5 and 50 percent (in increments of 5%) of the total DRAM installed.

Router(config)# memory-size iomem 10
Smart-init will be disabled and new I/O memory size will take effect upon reload.

As indicated, this command disables smart initialization, which is responsible for automatic IO memory allocation based on the modules installed. After a reload, we can verify that the IO memory allocation has been modified, and the memory-size iomem 10 command is present in the configuration:

Router# show version
Cisco 1841 (revision 6.0) with 235520K/26624K bytes of memory.
Router# show running-config | include iomem
memory-size iomem 10

IO memory allocation can be restored to its default behavior (relying on smart-init) by issuing the command default memory-size iomem:

Router(config)# default memory-size iomem
Smart-init will be enabled upon reload.

About the Author

Jeremy Stretch is a network engineer living in the Raleigh-Durham, North Carolina area. He is known for his blog and cheat sheets here at Packet Life. You can reach him by email or follow him on Twitter.


December 8, 2009 at 3:24 p.m. UTC

Interesting read. Now I have to look at some of our routers...thanks for the added work :)

December 9, 2009 at 3:12 p.m. UTC

I used that on a 3640 with the latest IOS it was doing strange things with the default configuration.

nemith (guest)
December 10, 2009 at 1:01 a.m. UTC

I wouldn't recommend altering these values. They differ based on the type and number of interfaces in the box. So if you add another Ethernet or T1 card and reboot you will see the number of I/O increase.

The smart-int values should always be sufficient and shouldn't be mucked with. It does a good job of allocating i/o memory.

Please don't go around doing this to all your routers, you are just going to have buffer misses in your future.

If you want to read more about how I/O buffers (and cisco routers themselves work I suggest this book.

shivlu jain (guest)
December 14, 2009 at 1:21 p.m. UTC

really gud one

December 14, 2009 at 9:20 p.m. UTC

It's been a while since I've needed to change any of those values. Generally I was having to change it from whatever someone had set to Smart-Init.

Nagarajan (guest)
December 17, 2009 at 4:35 a.m. UTC

Very interesting. Thanx

diablo (guest)
December 17, 2009 at 10:53 a.m. UTC

It really works when one runs out of either processor or IO memory on a device as a quick fix

Dane Davis (guest)
March 18, 2016 at 6:38 a.m. UTC

I was having a strange problem with NAT on my home router. I was able to ping no problem, browse HTTP sites no problem, but after a day or two, all HTTPS websites would time out. Wireshark showed retransmissions being sent, as if the website never received my request. After lengthy troubleshooting, I noticed my config had the command: memory-size iomem 10. I removed this command and things started working again. Interesting that this was related to an interface buffer memory issue.

robert smith (guest)
June 16, 2016 at 12:45 p.m. UTC

Hi, wondering if you can provide an overview of what iomem is or provide some sources for reading

thank you

Comments have closed for this article due to its age.