Hi, I was a bit frustrated by bad quality of memory usage info from top and ps, and decided to write my own utility. One problem I don't know how to solve is how to avoid counting twice (or more) memory used by processes which share VM (by use of CLONE_VM flage to sys_clone). I know how to detect and correctly account for threads (processes created with CLONE_THREAD), but how to detect non-threads with shared VM? If this question is not clear enough, maybe notes below and attached program for reading /proc/PID/* memory stats will help to understand it better. ========================= Shared VM detection In Linux, processes can have shared VM. Typically, they are threads, but it's not a certainty. In Linux, "threads" are processes which were created with CLONE_THREAD flag to clone(). They share PID, common parent and most of signal handling. Parent is only signaled when last thread exits, not every one. Each thread, though, has it's own thread ID (TID). Threads do not show up as /proc/PID, except for the "thread group leader" (that is, the process which did the first cloning with CLONE_THREAD). They are accessible thru /proc/PID/task/TID. Now, peculiarities you may need to know. Threads actually *are* accessible as /proc/TID too, they just aren't visible in ls (readdir/getdents syscall don't return you the info)! (Peculiar, but not very useful for mem accounting.) Threads are always spawned with CLONE_VM too. Yon cannot do CLONE_THREAD without CLONE_VM. This is enforced by Linux kernel. It means that they share the same VM. No COWing. And therefore you don't need to go to /proc/PID/task/TID/* and scan info there to figure out how much memory they use, and how. /proc/PID/* is enough. Inverse is not true! You can clone a process with CLONE_VM, but without CLONE_THREAD, and it will get new PID, and its own, visible /proc/PID entry. It creates a problem: there is no way you can figure out that /proc/PID1 and /proc/PID2 correspond to two processes which share VM, and if you will sum memory usage over the whole of /proc/*, you will count their usage twice. It can be nice to know how many such CLONE_VM'ed processes share VM with given /proc/PID. We can do accurate accounting of memory by dividing all memory numbers of this process by this number. But this info seems to be unavailable. /proc/PID/status has "Threads: N" line but it shows the number of threads, i.e. the number we are NOT interested in, because we can automatically account for them by not scanning /proc/PID/task/TID (ans thus counting all threads' mem usage only once, in thread group leader). "Threads: N" does not include processes created with CLONE_VM, but without CLONE_THREAD. (NB: CLONE_SIGHAND also seems to be not affecting it). =========================== -- vda