리눅스에서 디스크 용량을 체크하려면, df 나 du 명령어를 사용한다.

df는 파일시스텤 크기를 지정한다.

]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              28G  4.8G   23G  18% /
tmpfs                1014M     0 1014M   0% /dev/shm

]# du –h

엄청 많이 나온다.

 

그냥 du를 쓰기에는 조금 버겨울 수 있는데, 간단한 팁이 있다. 옵션 –hsc를 사용하여 해당 디렉토리를 넣어주면, 서브 디렉토리의 내용은 상세하게 보지 않아도 서브 디렉토리의 디스크 용량을 편리하게 찾아낼 수 있다.

 

]# cd /usr

]# du -hsc *
24K     X11R6
69M     bin
8.0K    etc
8.0K    games
60M     include
529M    lib
29M     libexec
346M    local
24M     sbin
528M    share
122M    src
4.0K    tmp
1.7G    합계

Posted by '김용환'
,

 

전 직장에서는 awk가 궁금하다 싶으면, 그냥 man awk 보면 된다고 했다. 그러나 현실은 man으로 할 수 없다. 그냥 매뉴얼일 뿐..

awk를 처음하거나, 오랜만에 다뤄보는 사람들을 위한 글을 소개한다.

순서대로 보는게 좋다.

 

http://www.kingcomputerservices.com/unix_101/processing_files_with_awk.htm

http://gregable.com/2010/09/why-you-should-know-just-little-awk.html

http://www.askapache.com/linux/awk-tutorial.html

http://www.grymoire.com/Unix/Awk.html

Posted by '김용환'
,

 

리눅스에서 동작하는 자바 어플리케이션 (톰캣) 을 실행하다 문제가 생겼을 때 써먹는 스크립트.

기본적인 시스템 정보와 자바 heap,native heap, 자바 쓰레드 정보, 자바 쓰레드 중에 cpu 많이 먹는 녀석등을 출력한다.

#!/bin/bash

if [ -z "$JAVA_HOME" ]
then
    echo "\$JAVA_HOME must be defined"
    exit -1
fi

if [ $# -eq 0  ]; then
    echo "Invalid argument count. Please input $pid of java process"
    exit -1
fi

pid=$1
jstackBin="$JAVA_HOME/bin/jstack"
jmapBin="$JAVA_HOME/bin/jmap"
dateStr=`date '+%Y%m%d_%H%M%S'`
dumpFile=threadDump.$dateStr

# init
touch dumpFile
echo $dateStr > $dumpFile
echo "" >> $dumpFile
echo "### ps" >> $dumpFile
echo "" >> $dumpFile
ps -ef | grep $pid | grep -v grep >> $dumpFile

# top result
echo "" >> $dumpFile
echo "### top result" >> $dumpFile
echo "" >> $dumpFile
top -cb -n 1 | head -n 12 >> $dumpFile

# all cpu ratio
echo "" >> $dumpFile
echo "### all cpu (sar -P ALL)" >> $dumpFile
echo "" >> $dumpFile
sar -P ALL 1 1 >> $dumpFile

# runq
echo "" >> $dumpFile
echo "### runq (sar -q)" >> $dumpFile
echo "" >> $dumpFile
sar -q 1 1 >> $dumpFile

# all netstat
echo "" >> $dumpFile
echo "### netsat " >> $dumpFile
echo "" >> $dumpFile
netstat -an >> $dumpFile

# cpu ratio of java thread
echo "" >> $dumpFile
echo "### cpu ratio of java thread" >> $dumpFile
echo "" >> $dumpFile
echo "cpu  thread-id" >> $dumpFile
ps -mo pcpu,lwp -p31527 | awk '{if ($2 ~/[0-9]/) {print $2  "% " $1""}}' | sort -k 1 -r >> $dumpFile 2>&1
echo "" >> $dumpFile

# heap memory (native heap + java heap)
echo "" >> $dumpFile
echo "### native heap" >> $dumpFile
echo "" >> $dumpFile
ps -p $pid -o pid,vsz,rss,drs,%mem >> $dumpFile 2>&1
echo "" >> $dumpFile

# thread dump
echo "" >> $dumpFile
echo "### thread dump" >> $dumpFile
echo "" >> $dumpFile
$jstackBin -F $pid >> $dumpFile 2>&1

# jmap  heap summary
echo "" >> $dumpFile
echo "### heap summary " >> $dumpFile
echo "" >> $dumpFile
$jmapBin -F -heap $pid >> $dumpFile 2>&1

# jmap histogram
echo "" >> $dumpFile
echo "### heap historam " >> $dumpFile
echo "" >> $dumpFile
$jmapBin -F -histo $pid | head -n 200 >> $dumpFile 2>&1


echo "system & java data dump : $dumpFile"

 

이 코드를 이용하면, 다음과 같은 java 어플리케이션은 다음과 같이 출력된다.

 

* 자바 어플리케이션

class RunnableThread implements Runnable {

        Thread runner;
        public RunnableThread() {
        }
        public RunnableThread(String threadName) {
                runner = new Thread(this, threadName); // (1) Create a new thread.
                System.out.println(runner.getName());
                runner.start(); // (2) Start the thread.
        }
        public void run() {
                //Display info about this particular thread
                System.out.println(Thread.currentThread());
        }
}

public class RunnableExample {

        public static void main(String[] args) {
                Thread thread1 = new Thread(new RunnableThread(), "thread1");
                Thread thread2 = new Thread(new RunnableThread(), "thread2");
                RunnableThread thread3 = new RunnableThread("thread3");
                //Start the threads
                thread1.start();
                thread2.start();
                try {
                        while(true) {
                        //delay for one second
                        Thread.currentThread().sleep(0);
;
                        }
                } catch (InterruptedException e) {
                }
                //Display info about the main thread
                System.out.println(Thread.currentThread());
        }
}

 

* dump 파일

./dump.sh java프로세스id

### ps

www       8055  6211  0 19:21 pts/1    00:00:00 /bin/bash ./test.sh 31527
www      31527 30883 99 Feb01 pts/0    1-01:05:58 /home/www/jdk6/bin/java RunnableExample

### top result

top - 19:21:20 up 36 days,  4:44,  2 users,  load average: 1.00, 1.00, 1.00
Tasks: 162 total,   1 running, 161 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12273860k total,  4505204k used,  7768656k free,   375084k buffers
Swap:  2096472k total,        0k used,  2096472k free,  3825760k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                          
31527 www       15   0 1171m  12m 6504 S 99.4  0.1   1505:59 /home/www/jdk6/bin/java RunnableExample          
    1 root      15   0 10344  680  572 S  0.0  0.0   0:01.37 init [3]                                         
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.04 [migration/0]                                    
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.02 [ksoftirqd/0]                                    
    4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 [watchdog/0]                                     

### all cpu (sar -P ALL)

Linux 2.6.18-164.el5 (blgdbs101)        2012³â 02¿ù 02ÀÏ

19½Ã 21ºÐ 20ÃÊ       CPU     %user     %nice   %system   %iowait    %steal     %idle
19½Ã 21ºÐ 21ÃÊ       all      2.50      0.00      5.83      0.00      0.00     91.67
19½Ã 21ºÐ 21ÃÊ         0     30.00      0.00     70.00      0.00      0.00      0.00
19½Ã 21ºÐ 21ÃÊ         1      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         2      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         3      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         4      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         5      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         6      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         7      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         8      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ         9      0.00      0.00      0.00      0.00      0.00    100.00
19½Ã 21ºÐ 21ÃÊ        10      0.00      0.00      0.99      0.00      0.00     99.01
19½Ã 21ºÐ 21ÃÊ        11      0.00      0.00      0.00      0.00      0.00    100.00

Average:          CPU     %user     %nice   %system   %iowait    %steal     %idle
Average:          all      2.50      0.00      5.83      0.00      0.00     91.67
Average:            0     30.00      0.00     70.00      0.00      0.00      0.00
Average:            1      0.00      0.00      0.00      0.00      0.00    100.00
Average:            2      0.00      0.00      0.00      0.00      0.00    100.00
Average:            3      0.00      0.00      0.00      0.00      0.00    100.00
Average:            4      0.00      0.00      0.00      0.00      0.00    100.00
Average:            5      0.00      0.00      0.00      0.00      0.00    100.00
Average:            6      0.00      0.00      0.00      0.00      0.00    100.00
Average:            7      0.00      0.00      0.00      0.00      0.00    100.00
Average:            8      0.00      0.00      0.00      0.00      0.00    100.00
Average:            9      0.00      0.00      0.00      0.00      0.00    100.00
Average:           10      0.00      0.00      0.99      0.00      0.00     99.01
Average:           11      0.00      0.00      0.00      0.00      0.00    100.00

### runq (sar -q)

Linux 2.6.18-164.el5 (blgdbs101)        2012³â 02¿ù 02ÀÏ

19½Ã 21ºÐ 21ÃÊ   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
19½Ã 21ºÐ 22ÃÊ         1       233      1.00      1.00      1.00
Average:            1       233      1.00      1.00      1.00

### netsat

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     
tcp        0      0 0.0.0.0:10560               0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:544                 0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:10561               0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:6051                0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:2105                0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:543                 0.0.0.0:*                   LISTEN     
tcp        0      0 1.2.80.92:2105            1.2.22.70:53828           ESTABLISHED
tcp        0      0 1.2.80.92:55785           1.2.235.21:35001          ESTABLISHED
tcp        0      0 1.2.80.92:2105            1.2.22.70:39864           ESTABLISHED
tcp        0      0 1.2.80.92:53006           1.2.235.22:35001          ESTABLISHED
udp    51912      0 0.0.0.0:333                 0.0.0.0:*                              
udp        0      0 0.0.0.0:421                0.0.0.0:*                              
udp        0      0 0.0.0.0:10241               0.0.0.0:*                              
udp        0      0 1.2.80.92:142             0.0.0.0:*                              
udp        0      0 127.0.0.1:22               0.0.0.0:*                              
udp        0      0 0.0.0.0:121                 0.0.0.0:*                              
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     7636   /opt/nbp/noms/var/master
unix  2      [ ]         DGRAM                    2964   @/org/kernel/udev/udevd
unix  14     [ ]         DGRAM                    7046   /dev/log
unix  2      [ ]         DGRAM                    4980259
unix  2      [ ]         DGRAM                    4980239
unix  2      [ ]         DGRAM                    4843655
unix  2      [ ]         DGRAM                    4843635
unix  2      [ ]         DGRAM                    4835066
unix  2      [ ]         DGRAM                    1236651
unix  3      [ ]         STREAM     CONNECTED     7661   /opt/nbp/noms/var/master
unix  3      [ ]         STREAM     CONNECTED     7660  
unix  2      [ ]         DGRAM                    7634  
unix  2      [ ]         DGRAM                    7543  
unix  2      [ ]         DGRAM                    7344  
unix  2      [ ]         DGRAM                    7309  
unix  2      [ ]         DGRAM                    7286  
unix  2      [ ]         DGRAM                    7055  

### cpu ratio of java thread

cpu  thread-id
31546% 0.0
31545% 0.0
31544% 0.0
31543% 0.0
31542% 0.0
31541% 0.0
31540% 0.0
31539% 0.0
31538% 0.0
31537% 0.0
31536% 0.0
31535% 0.0
31534% 0.0
31533% 0.0
31532% 0.0
31531% 0.0
31530% 0.0
31529% 0.0
31528% 99.9
31527% 0.0


### native heap

  PID    VSZ   RSS   DRS %MEM
31527 1199636 12372 1199598  0.1


### thread dump

Attaching to process ID 31527, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.1-b02
Deadlock Detection:

No deadlocks found.

Thread 31542: (state = BLOCKED)


Thread 31541: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=118 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=134 (Interpreted frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=3, line=159 (Interpreted frame)


Thread 31540: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116 (Interpreted frame)


Thread 31528: (state = IN_VM)
- java.lang.Thread.sleep(long) @bci=0 (Compiled frame; information may be imprecise)
- RunnableExample.main(java.lang.String[]) @bci=57, line=30 (Compiled frame)

 

### heap summary

Attaching to process ID 31527, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.1-b02

using thread-local object allocation.
Parallel GC with 10 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1073741824 (1024.0MB)
   NewSize          = 1048576 (1.0MB)
   MaxNewSize       = 4294901760 (4095.9375MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 16777216 (16.0MB)
   MaxPermSize      = 67108864 (64.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 16842752 (16.0625MB)
   used     = 1347584 (1.28515625MB)
   free     = 15495168 (14.77734375MB)
   8.000972762645915% used
From Space:
   capacity = 2752512 (2.625MB)
   used     = 0 (0.0MB)
   free     = 2752512 (2.625MB)
   0.0% used
To Space:
   capacity = 2752512 (2.625MB)
   used     = 0 (0.0MB)
   free     = 2752512 (2.625MB)
   0.0% used
PS Old Generation
   capacity = 44761088 (42.6875MB)
   used     = 0 (0.0MB)
   free     = 44761088 (42.6875MB)
   0.0% used
PS Perm Generation
   capacity = 16777216 (16.0MB)
   used     = 2069280 (1.973419189453125MB)
   free     = 14707936 (14.026580810546875MB)
   12.333869934082031% used

### heap historam

Object Histogram:

num       #instances    #bytes  Class description
--------------------------------------------------------------------------
1:              4831    483496  * ConstMethodKlass
2:              8140    396296  * SymbolKlass
3:              4831    388832  * MethodKlass
4:              1886    224232  char[]
5:              320     187152  * ConstantPoolKlass
6:              320     130496  * InstanceKlassKlass
7:              294     127056  * ConstantPoolCacheKlass
8:              516     91664   byte[]
9:              1743    41832   java.lang.String
10:             390     37440   java.lang.Class
11:             529     31304   * System ObjArray
12:             480     31168   short[]
13:             743     23776   java.util.TreeMap$Entry
14:             365     19472   int[]
15:             327     14000   java.lang.Object[]
16:             41      13448   * ObjArrayKlassKlass
17:             76      6080    java.lang.reflect.Method
18:             183     5760    java.lang.String[]
19:             96      4608    java.nio.HeapCharBuffer
20:             95      4560    java.nio.HeapByteBuffer
21:             40      2880    java.lang.reflect.Field
22:             8       2624    * TypeArrayKlassKlass
23:             113     2256    java.lang.Class[]
24:             8       1856    * MethodDataKlass
25:             58      1392    java.util.Hashtable$Entry
26:             17      1360    java.util.HashMap$Entry[]
27:             12      1344    * KlassKlass
28:             71      1136    java.lang.StringBuilder
29:             10      1040    java.util.Hashtable$Entry[]
30:             8       896     java.lang.Thread
31:             13      728     java.net.URL
32:             19      608     java.util.Locale
33:             15      600     java.util.HashMap
34:             35      560     java.io.File
35:             16      512     java.util.concurrent.ConcurrentHashMap$Segment
36:             8       512     java.lang.reflect.Constructor
37:             19      496     java.util.concurrent.ConcurrentHashMap$HashEntry[]
38:             20      480     java.util.concurrent.ConcurrentHashMap$HashEntry
39:             13      416     java.lang.ref.SoftReference
40:             13      416     java.util.LinkedHashMap$Entry
41:             16      384     java.util.concurrent.locks.ReentrantLock$NonfairSync
42:             14      336     java.util.HashMap$Entry
43:             10      320     java.io.ObjectStreamField
44:             2       320     java.lang.reflect.Method[]
45:             12      288     java.security.AccessControlContext
46:             5       280     sun.nio.cs.ext.EUC_KR$Decoder
47:             11      264     java.io.ExpiringCache$Entry
48:             16      256     sun.security.action.GetPropertyAction
49:             6       240     java.util.Hashtable
50:             7       224     java.lang.ref.Finalizer
51:             9       216     java.net.Parts
52:             8       192     java.lang.OutOfMemoryError
53:             4       192     java.util.TreeMap
54:             4       184     java.lang.reflect.Field[]
55:             3       168     sun.nio.cs.ext.EUC_KR$Encoder
56:             7       168     java.util.Vector
57:             4       160     sun.misc.URLClassPath$JarLoader
58:             8       152     java.io.ObjectStreamField[]
59:             9       144     java.lang.StringBuffer
60:             6       144     java.util.ArrayList
61:             15      120     java.lang.Object
62:             1       112     java.lang.ref.Reference$ReferenceHandler
63:             2       112     java.io.ExpiringCache$1
64:             1       112     java.lang.ref.Finalizer$FinalizerThread
65:             6       96      java.io.FileDescriptor
66:             2       96      java.lang.ThreadGroup
67:             4       96      sun.reflect.NativeConstructorAccessorImpl
68:             2       96      sun.nio.cs.StreamEncoder
69:             1       96      sun.net.www.protocol.file.FileURLConnection
70:             1       80      java.util.concurrent.ConcurrentHashMap$Segment[]
71:             1       80      java.lang.ThreadLocal$ThreadLocalMap$Entry[]
72:             5       80      sun.misc.URLClassPath$3
73:             2       80      java.io.BufferedWriter
74:             2       80      java.util.StringTokenizer
75:             1       72      sun.misc.Launcher$ExtClassLoader
76:             3       72      java.lang.ref.WeakReference
77:             1       72      sun.misc.Launcher$AppClassLoader
78:             3       72      sun.nio.cs.Surrogate$Parser
79:             3       72      java.util.Stack
80:             3       72      java.lang.RuntimePermission
81:             3       72      java.lang.NoSuchMethodError
82:             4       64      java.net.URLClassLoader$1
83:             2       64      java.io.FilePermission
84:             4       64      java.lang.Class$1
85:             4       64      java.lang.reflect.Constructor[]
86:             2       64      java.security.PrivilegedActionException
87:             4       64      sun.reflect.DelegatingConstructorAccessorImpl
88:             2       64      sun.misc.URLClassPath$FileLoader$1
89:             2       64      java.io.ExpiringCache
90:             2       64      java.lang.ClassNotFoundException
91:             2       64      java.lang.Thread[]
92:             2       64      java.lang.ThreadLocal$ThreadLocalMap$Entry
93:             4       64      sun.misc.MetaIndex
94:             2       64      java.io.PrintStream
95:             4       64      java.io.FileInputStream
96:             2       64      sun.misc.URLClassPath
97:             2       64      java.security.CodeSource
98:             3       56      java.io.File[]
99:             2       48      java.net.URL[]
100:            2       48      java.lang.ref.ReferenceQueue
101:            1       48      java.util.Properties
102:            2       48      java.security.Permissions
103:            2       48      java.io.BufferedOutputStream
104:            2       48      java.lang.ref.ReferenceQueue$Null
105:            1       48      java.io.BufferedReader
106:            3       48      sun.misc.Signal
107:            3       48      java.security.ProtectionDomain[]
108:            1       48      long[]
109:            3       48      java.lang.ThreadLocal
110:            2       48      java.io.OutputStreamWriter
111:            3       48      java.nio.charset.CodingErrorAction
112:            2       48      java.io.FileOutputStream
113:            3       48      RunnableThread
114:            3       48      java.lang.Boolean
115:            3       48      java.lang.Integer
116:            1       40      sun.nio.cs.StandardCharsets$Cache
117:            1       40      sun.nio.cs.StandardCharsets$Aliases
118:            1       40      sun.nio.cs.StreamDecoder
119:            1       40      java.util.concurrent.ConcurrentHashMap
120:            1       40      sun.nio.cs.StandardCharsets$Classes
121:            5       40      java.lang.Class$3
122:            2       32      java.util.HashSet
123:            1       32      java.lang.ClassLoader$NativeLibrary
124:            1       32      java.lang.OutOfMemoryError[]
125:            1       32      sun.misc.SoftCache
126:            4       32      java.lang.ref.ReferenceQueue$Lock
127:            2       32      java.io.FilePermission$1
128:            1       32      java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
129:            2       32      sun.misc.NativeSignalHandler
130:            2       32      java.nio.ByteOrder
131:            1       32      java.lang.ThreadGroup[]
132:            1       32      java.util.Collections$SynchronizedMap
133:            1       32      sun.nio.cs.ext.ExtendedCharsets
134:            4       32      sun.reflect.ReflectionFactory$GetReflectionFactoryAction
135:            1       32      java.security.ProtectionDomain
136:            1       32      java.io.BufferedInputStream
137:            2       32      java.nio.charset.CoderResult
138:            1       24      java.io.FileReader
139:            1       24      sun.net.www.MessageHeader
140:            1       24      java.security.BasicPermissionCollection
141:            3       24      sun.reflect.ReflectionFactory$1
142:            1       24      java.io.UnixFileSystem
143:            1       24      java.lang.StringCoding$StringDecoder
144:            1       24      java.lang.NullPointerException
145:            1       24      java.lang.VirtualMachineError
146:            1       24      java.lang.reflect.ReflectPermission
147:            1       24      sun.misc.Launcher$AppClassLoader$1
148:            1       24      sun.nio.cs.StandardCharsets
149:            1       24      java.lang.ThreadLocal$ThreadLocalMap
150:            1       24      java.util.BitSet
151:            1       24      java.lang.ArithmeticException
152:            1       24      java.lang.StringCoding$StringEncoder
153:            1       24      sun.nio.cs.ext.EUC_KR
154:            1       24      java.lang.ref.Reference
155:            1       16      java.nio.charset.CoderResult$1
156:            1       16      java.util.Collections$EmptyMap
157:            1       16      sun.misc.Launcher$ExtClassLoader$1
158:            2       16      sun.net.www.protocol.jar.Handler
159:            1       16      java.io.FilePermissionCollection
160:            1       16      java.security.Principal[]
161:            1       16      java.util.Collections$EmptyList
162:            1       16      java.lang.StackTraceElement[]
163:            1       16      java.security.cert.Certificate[]
164:            1       16      java.security.Policy$UnsupportedEmptyCollection
165:            1       16      sun.jkernel.DownloadManager$1
166:            1       16      java.util.concurrent.atomic.AtomicInteger
167:            1       16      sun.misc.URLClassPath$FileLoader
168:            1       16      java.nio.charset.CoderResult$2
169:            1       16      sun.misc.Launcher
170:            1       16      java.security.ProtectionDomain$Key
171:            1       16      java.lang.SystemClassLoaderAction
172:            1       16      java.lang.ClassLoader$3
173:            1       8       java.lang.reflect.ReflectAccess
174:            1       8       java.net.UnknownContentHandler
175:            1       8       sun.net.www.protocol.file.Handler
176:            1       8       java.lang.System$2
177:            1       8       java.security.ProtectionDomain$2
178:            1       8       sun.misc.Unsafe
179:            1       8       java.util.Hashtable$EmptyIterator
180:            1       8       java.util.Collections$ReverseComparator
181:            1       8       java.net.URLClassLoader$7
182:            1       8       java.security.AccessControlContext$1
183:            1       8       java.lang.ref.Reference$Lock
184:            1       8       java.io.FileDescriptor$1
185:            1       8       sun.misc.Launcher$Factory
186:            1       8       java.lang.Terminator$1
187:            1       8       java.lang.Compiler$1
188:            1       8       java.util.Hashtable$EmptyEnumerator
189:            1       8       sun.jkernel.DownloadManager$2
190:            1       8       java.lang.Runtime
191:            1       8       java.nio.charset.Charset$3
192:            1       8       java.lang.String$CaseInsensitiveComparator
193:            1       8       java.util.Collections$EmptySet
194:            1       8       sun.reflect.ReflectionFactory
195:            1       8       sun.misc.ASCIICaseInsensitiveComparator
Total :         27128   2294784

Posted by '김용환'
,

$ sudo passwd root
[sudo] password for kimyonghwan:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

$  su
Password:
Posted by '김용환'
,

Applications->Accessories->Disk Usage Analyzer 를 통해서 디스크 용량 확인
Scan Home 버튼을 눌러스 디렉토리 용량 확인
Posted by '김용환'
,

 

구글에서 bigtable을 관리하면서 하드디스크가 깨지는 현상이 있어서 SMART 라는 툴을 써서 어떻게 하면 좋을지 통계도 내고 하드디스크 폴트를 조금이나마 예측하려는 시도에 대한 논문 비스므리한 글을 읽고 정리한 적이 있었다.

Failure Trends in a Large Disk Drive Population(http://knight76.tistory.com/entry/Failure-Trends-in-a-Large-Disk-Drive-Population)

나도 운영하면서 하드디스크가 2년 만에 디스크 폴트가 자주 일어나서, 내가 관리하는 서버들만 그런 줄 알았더니. 구글도 똑같구나 하는 생각을 했었다.

이 프로그램이 당시에는 없었던 것 같은데. ubuntu 용으로 프로그램이 나온 것 같다. GUI용으로 gsmartcontrol, CMI로는 smartmontools 라는 프로그램이다.


System->Admin->Synaptic Package Manager 어플을 실행한 후, Quick Filter에 설치 어플리케이션의 이름을 입력하면 다음과 같은 화면이 뜨고 설치할 수 있다.

image

 

Application->System Tools –> GSmartContol  어플을 실행시킨다.

image

 

만약 VM 가상드라이브의 경우에는 자세한 정보가 보이지 않는다. 그러나 만약 리얼이면 아래와 같은 화면이 보인다.

GSmartControl main window GSmartControl attribute list

 

자세한 정보는 아래 페이지에서 확인하면 될 것 같다. 시스템 엔지니어나 운영자에게 도움이 될 것 같다. 이 정보를 근거로 좀 더 예측 가능한 상황이 될 수 있을 것 같다.

https://help.ubuntu.com/community/Smartmontools

Posted by '김용환'
,

 

나의 서버의 현재 메모리는 시스템적으로 돌아가는 프로세스만 동작 중이다. 그래서 펑펑 놀고 있는 서버이다.

image

 

top명령으로 보았을 때, 정보를 보면 약간 이상하다. 전체 메모리 2G에 사용된 (used) 메모리 1.2G이다.  결국 8G 의 free 메모리만 있다. buffers와 cached 메모리에 많은 메모리가 할당되어 있다.

image

 

그 이유는 리눅스 커널에서는 프로세스가 반납한 메모리를 바로 free로 돌리지 않는다.

Cached memory는 실행중인 프로그램이 메모리가 필요하다면 바로 대체될 수 있는 free memory인 셈이다. 기존에 실행했던 프로그램이 이 영역을 사용했었고, 또 필요하면 이 영역을 준다고 하면 될 것 같다.

buffers 메모리는 data structure, chunk의 개념이 들어가 있는 메모리인데 반해 cached는 패킷 단위의 메모리 로 보면 된다.

리눅스 커널은 ram에 대해서 buffers, cached, free 이렇게 3단계로 구분해서 메모리를 구분하고 있다.

 

top 명령어를 통해서 본 메모리를 본다.

image

VIRT는 프로세스가 전에 사용했던 가상 메모리의 전체 크기를 말한다. code, data, shared library 등을 포함한다. top 명령어는 각 프로세스의 /proc/#pid/state 의 VmSize 의 내용을 가지고 이 정보를 보여준다. swap + res 영역을 더한 값이다. 이 값이 크면, 얼마나 많은 메모리가 접근하고 있는지를 알 수 있는 지표가 된다.

RES는 프로세스가 사용중인 RAM 에 올라간 물리 메모리 (swap 제외) 를 말한다.

SHR는 프로세스가 사용중인 공유 메모리의 합이다.

 

나머지 정보는 man top 을 통해서 볼 수 있다.

'c or linux' 카테고리의 다른 글

[ubuntu] 디스크 용량 확인  (0) 2012.01.18
Ubuntu의 SMART 프로그램  (0) 2012.01.09
Swap 메모리  (2) 2012.01.05
리눅스 운영체제의32bit 또는 64bit 여부 확인  (0) 2011.12.30
ubuntu 패스워드 변경  (0) 2011.11.23
Posted by '김용환'
,

Swap 메모리

c or linux 2012. 1. 5. 12:04

 

시작하며..

리눅스의 swap 메모리에 대해서 이해한다.

 

본론

만약 어플리케이션의 RAM 용량이 차면, swap 메모리가 자동으로 늘어나도록 되어 있다. 하드디스크의 디스크를 swap 메모리로 만들기 때문에 속도가 느려진다. 또한 RAM의 용량보다 2배로 swap 메모리를 잡도록 되어 있다. (참조 : http://vr.org/docs/centos/4/html/rhel-sag-en-4/ch-swapspace.html) 시스템 엔지니어는 이런 이슈로 리눅스 서버를 셋팅할 때 swap 영역을 얼마나 잡을지 판단해야 한다. 때로는 개발자가 이 부분을 고쳐 성능을 향상 시킬 수 있다. (참고 : https://wiki.archlinux.org/index.php/Swap)


개인적으로는 메모리가 갑자기 부족한 경우를 제외하고는 swap 자체를 안쓰는 것을 선호한다. 성능상 swap 메모리를 쓰는 것보다 swap in , swap out이 성능을 무너뜨리는 것을 많이 봐왔다. 또한 너무 크게 사용하는 것도 경계한다. (난 보수적인 사람이 되었나 보다… 아직 적절히 활용한 대용량 처리 사례를 못해봐서 그런지도 모르겠다. ) 차라리 RAM 하나 더 꽂는게 더 나은 것 같다. 

하지만 DB나, 오픈 소스 대용량 처리 어플리케이션의 경우에서는 swap을 많이 활용하려고 하고 있다는 사실이다. 어떻게 하든 속도를 내기 위해서 메모리에서 처리하려다 보니 swap을 쓸 수 밖에 없는 구조로 가고, 너무 많이 써서 문제가 되니 다시 mlock으로 막는 구조로 가는 부분으로 처리하는 형태로 가고 있다.

 

1. swap 및 ram 메모리 상태 보기

free 명령어를 이용해서 간단히 살펴볼 수 있다.

# free
             total       used       free     shared    buffers     cached
Mem:       4150252    3991868     158384          0      78504    2265916
-/+ buffers/cache:    1647448    2502804
Swap:      2096472        208    2096264

 

2. Swap 메모리 설정하는 방법

리눅스 커널 2.6부터 swap 메모리를 설정할 수 있다. swap 영역은 dd 명령어와 mkswap 명령어를 이용해서 swap을 만들 수 있다. (http://www.artwork.com/gdsii/qckvu/faq/linux_swap.htm) 이렇게 만들어진 영역은 swap 메모리로 쓰고 있다는 뜻이다. 아래의 예는 swap을 2G 정도만 쓰고 있다는 것을 의미한다.

# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/cciss/c0d0p2                 partition       2096472    208        -1

 

3. Swap 메모리 사용 빈도 설정 방법

swap 메모리를 사용 빈도를 확인하는 방법은 vm.swappiness 정보를 보는 것이다. centos를 비롯한 일부 서버는 디폴트로 60으로 잡혀 있다.

]# sysctl vm.swappiness   (또는 cat /proc/sys/vm/swappiness 으로 확인 가능)
vm.swappiness = 60

vm.swapiness 정보는 커널 파라미터이며 swap 영역을 얼마나 더 보겠냐 (또는 회피하겠냐)는 의미를 가지고 있다. (kernel's preference (or avoidance) of swap space) 여기에 0의 값을 넣으면 swap을 최대한 쓰지 않겠다는 의미이다. 만약 100은 하드디스크의 swap영역을 최대한 활용하겠다는 의미이다.

제일 이슈는 swap 메모리가 많이 잡혀 있는 것보다 얼마나 사용하고 있는지를 측정하는 것이 좋다. free나 cat /proc/swaps 명령어를 이용해서 해결할 수 있다.

만약 swap 메모리를 쓰지 않으려면, vm.swappiness를 0으로 셋팅하면 된다.

/etc/sysctl.conf 에 ‘vm.swappiness=0 ‘ 설정을 추가하고, ‘echo 0 > /proc/sys/vm/swappiness ‘ 명령어를 이용해서 적용한다.


* Reference

http://forums.gentoo.org/viewtopic.php?t=175419

5. Swappiness (2.6 kernels)
Since 2.6, there has been a way to tune how much Linux favors swapping out to disk compared to shrinking the caches when memory gets full.

ghoti adds:
When an application needs memory and all the RAM is fully occupied, the kernel has two ways to free some memory at its disposal: it can either reduce the disk cache in the RAM by eliminating the oldest data or it may swap some less used portions (pages) of programs out to the swap partition on disk.
It is not easy to predict which method would be more efficient.
The kernel makes a choice by roughly guessing the effectiveness of the two methods at a given instant, based on the recent history of activity.

Before the 2.6 kernels, the user had no possible means to influence the calculations and there could happen situations where the kernel often made the wrong choice, leading to thrashing and slow performance. The addition of swappiness in 2.6 changes this. 


 

또한 vfs_cache_pressure 라는 값을 크게 잡아, 커널의 cache를 빨리 날려줄 수 있도록 한다. linux에서는 어플에서 처리한 남는 메모리를 바로 free되지 않고 buffer cache에 남게 한다. 이를 이용하면 free memory를 더 확보할 수 있다. 하지만 위험성이 존재하니, 테스트가 필요하다.

 


4. swap in, swap out 확인하는 방법

sar 명령어를 이용하면 메모리 상태를 확인할 수 있다. 

]# sar -r -s 11:41:00
Linux 2.6.9-78.ELsmp        

11시 41분 kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
11시 42분   5932304  10700956     64.33    358820   1087040   2096280       192      0.01         0
Average:    5932304  10700956     64.33    358820   1087040   2096280       192      0.01         0

 

sar 명령어의 –B 파라미터는 swapping 통계를 낸다.

]# sar -B 2 5
Linux 2.6.9-78.ELsmp

11시 41분 28초  pgpgin/s pgpgout/s   fault/s  majflt/s
11시 41분 30초      2.04     75.51     21.43      0.00
11시 41분 32초      0.00      0.00    359.49      0.00
11시 41분 34초      0.00    258.46     19.49      0.00

 

5. 이슈

jvm 영역에서 사용된 메모리는 언제나 swap 영역으로 이동될 수 있다. 
jvm 에서 nio를 사용하는 경우 (예, DirectBuffer) 에는 리눅스 운영체제가 언제든지 swap 영역으로 이동할 수 있다. 이를 방지하기 위해서는 mlock/mlockall 시스템 콜을 이용해서 특정 virtual address를 ram 에 묶어 둘 수 있게 한다. 

mlock을 쓰는 방식이 cassandra 0.6.5 에서 추가되었다.

 

마치며..

리눅스의 swap 메모리를 이해할 수 있었다. jvm을 사용하면서 나타날 수 있는 swap 메모리 이슈에 대해서 쉽게 처리할 수 있도록 공부하자.

cassandra의 swap 이슈 에 대한 분석을 좀 더 이해하려고 한다.

Posted by '김용환'
,

$ uname -m
x86_64

$ uname -mnr
hostname  2.6.18-164.el5 x86_64
 

$ lsb_release -a

 LSB Version:    :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: CentOS
Description:    CentOS release 4.7 (Final)
Release:        4.7
Codename:       Final

'c or linux' 카테고리의 다른 글

TOP 을 통해 본 리눅스 메모리  (0) 2012.01.06
Swap 메모리  (2) 2012.01.05
ubuntu 패스워드 변경  (0) 2011.11.23
Ubuntu 11.04 패스워드 분실시 처리  (0) 2011.11.15
ubuntu를 한국에서 빨리 다운받을 수 있는 곳  (0) 2011.11.08
Posted by '김용환'
,

원래 root 패스워드를 알 수 없어서 . 변경한다. sudo 쓰기 진짜 귀찮다...

$ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Posted by '김용환'
,