Memory usage - default X install can't use yum with 1GB RAM machine

Curtis Doty Curtis at GreenKey.net
Fri Oct 12 18:09:13 UTC 2007


Yesterday James Antill said:

> On Thu, 2007-10-11 at 16:26 -0400, sean darcy wrote:
>> James Antill wrote:
>> ................
>>>  I've attached a simple python script I've used, it's not perfect but it
>>> shows roughly how much dead memory you have and will kind of show where
>>> it is.
>>>
>>
>> Great script. But is rebooting the only answer?
>
> So what it tries to show is how much memory is being "allocated" to
> files that no longer exist. This _could_ be a normal thing, but is most
> often due to shared libraries that have either been upgraded or changed
> via. prelink ... but which are still mapped into another application.
>
> So, yes, the only way to fix that is to "reboot" the application so it
> uses the new version of the shared library instead of the old deleted
> one. For some applications it's easy enough to just restart them, for
> others you might as well just reboot the entire machine.
>

Yes way cool, James. That script hightlights a bunch of info I've been 
curious about and too lazy to RTF proc(5). Here's a little patch to make 
it disclose which processes are sitting on the deleted libs.

--- wasted-ram-updates.py.orig  2007-10-12 09:55:34.000000000 -0700
+++ wasted-ram-updates.py       2007-10-12 10:38:17.000000000 -0700
@@ -13,6 +13,7 @@ def loc_num(x):
      return locale.format("%d", int(x), True)

  pids = []
+cmds = {}
  for d in os.listdir("/proc/"):
      try:
          pid = int(d)
@@ -20,6 +21,14 @@ for d in os.listdir("/proc/"):
      except:
          pass

+def cmdFromPID(pid):
+    """fetch command line from a process id"""
+    try:
+        cmdline= open("/proc/%i/cmdline" %pid).readlines()[0]
+        return " ".join(cmdline.split("\x00")).rstrip()
+    except:
+        return ""
+
  def map_sz(x):
      (beg, end) = x.split('-')
      return (int(end, 16) - int(beg, 16))
@@ -38,10 +47,7 @@ for pid in pids:
          while off < len(lines):
              line = lines[off]
              off += 1
-            try:
-                int(line[0])
-            except:
-                continue
+            if line[0] in ["S", "R", "P"]: continue

              data = line.split(None, 5)
              try:
@@ -59,6 +65,8 @@ for pid in pids:
              if '(deleted)' not in data[5]:
                  continue

+            cmds[pid]= cmdFromPID(pid)
+
              key = "%s:%d" % (data[3], ino)
              if key not in files:
                  files[key] = lambda x: x # Hack
@@ -121,7 +129,9 @@ for x in files.values():
      s_private_dirty += x.s_private_dirty
      referenced      += x.referenced

-    print x.pids, loc_num(x.vsz), x.name,
+    print "%7sKB %s" %(loc_num(x.vsz/1024), x.name),
+    for p in frozenset(x.pids):
+        print "      %5i %s" %(p, cmds[p])
  print "\
  =============================================================================="
  print "num             = %-20s" % loc_num(len(files))

Note that it also attempts to fix a (possible?) bug of missing an address 
above 2.5GB. Although I dunno the likelyhood of this, the "fix" is neater 
though.

Thanks!
../C




More information about the fedora-devel-list mailing list