linux에서 netstat 상태를 tcp state별로 보려면 netstat와 awk를 사용하면 된다.



$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

SYN_SENT 6

CLOSE_WAIT 22

ESTABLISHED 31




만약 redis 포트(6379) 만 보려면 grep을 이용한다.

$ netstat -n | grep -regexp="*:6379" | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'




Posted by '김용환'
,



https 서버에 curl을 이용해 연결하려면, -k 옵션을 추가한다. 



 curl -k  https://127.0.0.1/server-status?auto

Total Accesses: 166

Total kBytes: 8

CPULoad: .483936

Uptime: 498

ReqPerSec: .333333

BytesPerSec: 16.4498

BytesPerReq: 49.3494

BusyWorkers: 1

IdleWorkers: 27

Scoreboard: ___W________________________............................................................................................................................................

Posted by '김용환'
,

텍스트 파일의 위나 아래쪽으로 보고 싶으면 head 또는 tail를 사용한다.

그러나 텍스트 파일 특정 라인을 보고 싶을 때는 sed를 활용한다.



LICENSE 파일의 10번째, 11번째 줄만 보고 싶을 때


 $ sed -n '10,11p' LICENSE

      "License" shall mean the terms and conditions for use, reproduction,

      and distribution as defined by Sections 1 through 9 of this document.




LICENSE 파일의 10번째, 11번째 줄을 제외한 나머지를 보고 싶을 때


 $ sed -e '10,11d' LICENSE




Posted by '김용환'
,



Linux의 split 명령 예제


split은 파일을 여러개로 쪼갤 수 있다. 그냥 생각없이 split 이라는 명령어를 사용하면 이상한 이름으로 파일이 쪼개져 나온다. 그래서 옵션을 사용하면 파일을 잘 나눌 수 있다.



xxxxxx 파일을 test0, test1... 로 나누어 1000bytes씩 파일을 쪼갤 수 있도록 한다. 

-a 뒤의 값은 자리수를 의미한다. 자리수가 넘어가면 더이상 split을 하지 않으니 여유있게 잡아야 한다. 



$  split -b 1000 -d -a 1  xxxxxx  test

split: output file suffixes exhausted


$ ls -al test*

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test0

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test1

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test2

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test3

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test4

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test5

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test6

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test7

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test8

-rw-r--r--   1 deploy users       1000 2015-01-28 19:19 test9



참고로 -l은 line number 로 파일을 나눌 수 있다. 1000라인단위로 파일을 자리도록 한다. 


$  split -l 1000 -d -a 1  xxxxxx  test


Posted by '김용환'
,


리눅스에서 메모리를 많이 사용하는 프로세스를 찾기 (역순, 가장 메모리를 많이 사용하는 프로세스가 마지막)


$ ps -e -orss=,args= | sort -k1,1n -b 




리눅스에서 메모리를 많이 사용하는 프로세스 4개 찾기 (역순, 가장 메모리를 많이 사용하는 프로세스가 마지막)



$ ps -e -orss=,args= | sort -k1,1n -b | tail -n 4 




리눅스에서 메모리를 많이 사용하는 프로세스 4개 찾기 (역순, 가장 메모리를 많이 사용하는 프로세스가 마지막) - 한줄로 출력하기



$ ps -e -orss=,args= | sort -k1,1n -b | pr -TW$COLUMNS |  tail -n 4 


또는 

$ ps -e -orss=,args= | sort -k1,1n -b | tail -n 4 |  pr -TW$COLUMNS






Posted by '김용환'
,

리눅스에서 동일한 파일을 수정할 때 조심해야 한다.

input과 output이 동일한 파일일 때.. cat, cp, mv 은 다음 아래가 발생한다. 



$ cat > 1

11111


$ cat 1 > 1

cat: 1: input file is output file


$ cp 1 1

cp: `1' and `1' are the same file



$ mv 1 1

mv: `1' and `1' are the same file





sed 의 경우는 에러가 발생하지 않는다.  당연하게도 시스템적으로는 맞지만..

context 적인 오류를 범할 수 있다. 


1의 내용을 모두 2로 바꾸고 싶다면, 아래와 같이 쓸 수 있는데, 이 부분은 잘못된 결과를 발생하게 된다. 


$ sed -i -e 's/1/2/g' 1 > 1

$ cat 1

(없음)




아래와 같이 sed 명령어의 -i 옵션을 추가하면 바로 수정이 된다. 

$ sed -i -e 's/1/2/g' 1

$ cat 1

22222







Posted by '김용환'
,


리눅스의 ps 명령어의 eLf와 lwp는 thread 정보를 구할 수 있다.


java에서 thread가 Future를 많이 쓰지 않는 경우, 즉, 계속 netty 또는 tomcat pool thread의 경우 cpu 를 많이 소진하는 thread 번호(10진수)를 얻어올 수 있다.  수치가 높을 수록 누적 cpu 소진이 많은 cpu를 의미한다.


$  ps -eLf -p 프로세스 넘버 |grep java |awk '{print $4,$7,$9}'  | grep -v "00:00:00" |sort -k 4 -r |head -n 30


9750 18:21 00:00:03

9177 18:21 00:00:04

9176 18:21 00:00:04

9175 18:21 00:00:05

9174 18:21 00:00:05

9173 18:21 00:00:05

9172 18:21 00:00:04

9171 18:21 00:00:05

9170 18:21 00:00:04

9169 18:21 00:00:05

9168 18:21 00:00:05

9167 18:21 00:00:04

9166 18:21 00:00:04

9165 18:21 00:00:04

9164 18:21 00:00:05

9163 18:21 00:00:04

9162 18:21 00:00:04

9161 18:21 00:00:04



그러나, 위 명령어는 태생적인 한계가 있는데, Future를 사용하는 Thread는 잘 못 잡는 경우가 존재할 수 있다. 이 때는 갑자기 튀어 cpu 를 많이 소비하는 (튀는) thread 를 구할 때 유용하다. 



$ ps -mo pcpu,lwp -p 프로세스 넘버 | awk '{if ($2 ~/[0-9]/) {print $2 " " $1""}}' | sort -k 2 -r  | head -n 10


Posted by '김용환'
,


strace는 응용 프로그램의 시스템 호출을 찾아주는 리눅스 툴이나,  grep을 하려면 잘 되지 않는 것처럼 보인다. 



$ strace -p 1111 | grep  epoll

그대로 출력된다.



그 이유는 strace는 standard output이 아닌 standard error 출력이다.

standard error(2)를 standard output(1)로 변경한후 grep하면 가능하다.


$strace -p 1111 2>&1 | grep epoll




grep의 의도가 명확히 볼 수 있다. 



참조 : http://www.cyberciti.biz/faq/redirecting-stderr-to-stdout/

Posted by '김용환'
,


erlang을 설치했다가 capistrano가 실행이 안되는 문제가 발생했다.

erlang의 openssl lib의 버전과 이슈가 되는 부분이 있어서 Symbol not found: _SSLv2_client_method (LoadError) 가 발생했다. 



$ capistrano

/Users/Samuel/.rbenv/versions/2.1.0/lib/ruby/2.1.0/openssl.rb:17:in `require': dlopen(/Users/Samuel/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle, 9): Symbol not found: _SSLv2_client_method (LoadError)

  Referenced from: /Users/Samuel/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle

  Expected in: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

 in /Users/Samuel/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle - /Users/Samuel/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle



해결은 설치된  rbenv (2.1.0)으로 다시 설치하면 된다. 


$ rbenv install 2.1.0

rbenv: /Users/Samuel/.rbenv/versions/2.1.0 already exists

continue with installation? (y/N) y

Downloading ruby-2.1.0.tar.gz...

-> 

Installing ruby-2.1.0...

Installed ruby-2.1.0 to /Users/Samuel/.rbenv/versions/2.1.0



Posted by '김용환'
,

네트웍이 문제가 되어 서버의 부하가 발생하면 retransmission이 발생하게 된다.

retransmission이 발생되는지 확인하기 위해서는 netstat 을 이용한다.


계속 누적된 값으므로, 문제가 되는 시점에 netstat -s 명령으로 덤프 후 소켓 타입(예, tcp)으로 retransmited 의 값을 비교하면 된다. 



$ netstat -s


.........


Tcp:

    37050876 active connections openings

    16489872 passive connection openings

    6068438 failed connection attempts

    21981958 connection resets received

    4980 connections established

    226759045459 segments received

    298920462169 segments send out

    4056591 segments retransmited

    1057 bad segments received.

    31228471 resets sent


....





실시간으로 네트웍 상황을 체크하기 위해서는 mrr을 이용하면 좋다.

(잼투인의 박현준 대표님이 알려주심)


https://github.com/naver/arcus-misc/tree/master/mrr



서버단) $ ./mrr -s -addr 1.1.1.1 -port 1111  

클라단) $ ./mrr -addr 1.1.1.1 -port 1111



Posted by '김용환'
,