rsync를 이용해 ssh 터널링을 쓰는데, 잘 붙긴 하는데. 아래와 같은 에러가 발생한다. 


Bad local forwarding specification 'rsync.apache.org:873'



확인해보니.. 


https://github.com/sequelpro/sequelpro/issues/2164



구 버전 1.0.1 버전을 사용하고 있었다. 신 버전(1.1.2)에서는 더 이상 에러가 발생하지 않을 것 같다.





Posted by '김용환'
,


scp에서 디렉토리를 상대방 머신에 잘 복사(recursive copy)하려면 


-rp 를 사용한다.


예, scp -rp mesos www@machine:/home/www/mesos





Posted by '김용환'
,


과거에는 netstat -anp을 이용해 특정 포트를 리스닝(Listen)하는 특정 프로세스를 찾았다.



$ netstat -anp | grep LISTEN


tcp        0      0 172.17.64.41:7077           0.0.0.0:*                   LISTEN      26464/java

tcp        0      0 0.0.0.0:51047               0.0.0.0:*                   LISTEN      13816/java

...



lsof에도 비슷한 옵션이 있다. 조금 더 깔끔하게 출력된다. 그리고 컬럼 크기도 정할 수 있어서 유용하다.



$ lsof +c10  -iTCP -sTCP:LISTEN


COMMAND      PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME

java        1627 www   15u  IPv4 605880628      0t0  TCP *:41384 (LISTEN)

java        1627 www   30u  IPv4 605880676      0t0  TCP *:36194 (LISTEN)


Posted by '김용환'
,

1. 리눅스에서 ssd인지 hdd인지 확인하는 설정



/sys/block/sda/queue/rotational의 값이 0이면 SSD이고

/sys/block/sda/queue/rotational의 값이 1이면 HDD이다. 


$ cat /sys/block/sda/queue/rotational

1


$ cat /sys/block/sdb/queue/rotational

0



2. 리눅스에서 scsi hdd 여부 확인하는 커맨드

hdparm -I /dev/sda

Posted by '김용환'
,


리눅스 커맨드를 찾는 info 커맨드도 있다.. 





Posted by '김용환'
,


read에 -r 옵션을 실행한 상태에서 라인 끝에 \ 문자를 추가하더라도 더 이상 라인을 계속 입력받지 않는다.



[~] read a

adfasdf asdfasdf afdsaf \

> 1 2 \

> 3 4

[~] echo $a

adfasdf asdfasdf afdsaf 1 2 3 4

[~] read -r b

asdfsad asdfasfd asdfsafd \

[~] echo $b

asdfsad asdfasfd asdfsafd \

Posted by '김용환'
,


powertop 커맨드는 네트워크 카드의 상태 모니터링 뿐 아니라, c-state로 들어갈 지 여부를 설정할 수 있다. 

또한 정보를 csv로 사용할 수 있다.


c-state는 Intel에서 만든 전원 상태를 관리할 수 있는 방법이라 할 수 있다. cpu 내부에서 사용중이면 활성화하고 사용 중이 아니라면 낮은 성능을 유지시켜 전원을 낮게 쓰게 하는 효율적으로 유지한다. 


아래 링크의 공식 문서(Controlling Processor C-StateUsage in Linux)에 따르면 설명이 되어 있다. 




while it does save power, it takes time to enter and exit C-states. Generally the higher theC-state, more power is saved when the processor is idle, but it takes longer to get the CPU back upagain when it is needed. The C-states are:


C0 The CPU is actively running code


C1 The CPU uses the HLT instruction when idle-the clock is gated off to parts of the core, but it is relatively quick to wake up


C1E This is actually just C1, except when C1E is enabled, the CPU lowers the CPU’s speed & voltage when it is in C1


C2 & up The CPU will shut off various parts of the core for greater power savings, at thecost of taking longer to wake up


In most Linux distributions today, C-states are enabled by default, which is great for most users. Theoperating system will choose which C-state to use based on processor utilization and other factors.Some users, though, want very low latency, and are very sensitive to how quickly a CPU can run codewhen needed, so user control is desired.



문제는 c-state 상태를 intel cpu가 마음대로 결정하는 것이 default 설정이라서, 서비스 장비의 네트워크 카드까지 idle로 만들 수 있다는 점이다. 잠깐 쉬고 있는 것이지 아예 안쓰는 것은 아니라서..


그래서 자바 애플리케이션 서버에서 다음과 같은 에러를 발생한다.


java.net.UnknownHostException: googleplus001: unknown error
    at java.net.InetAddress.getLocalHost(InetAddress.java:1505)



c-state가 적용되지 않게 하려면 다음을 설정한다. 아래 링크의 공식 문서(Controlling Processor C-StateUsage in Linux)대로 진행한다. 


if you want control over C-states, or if your system might have CPUs that are newerthan the version of intel_idle in your kernel, you should use kernel parameter "intel_idle.max_cstate=0" to disable this driver.


커널 매개 변수로 intel_idle.max_cstate=0을 적용한다. 

grub 파일을 쓰고 있다면, /boot/grub/grub.conf 파일에 intel_idle.max_cstate=0를 설정하고 재시작한다. 

기존에 어떻게 동작하고 있었는지 보려면 grep idle /var/log/messages를 실행한다. 




그러면 항상 cpu에서는 모든 프로세스를 c0 상태로 두게 될 것이다. (acpi_idle 모듈이 사용됨을 의미한다)



부팅후에는 아래 커맨드로 확인해서 정상적으로 적용되었는지 확인한다.  (디폴트 값도 확인할 수 있다)


$ dmesg | grep -i intel_idle


acpi_idle이 동작되는지 살펴보면 다음과 같다. 


$ cat /proc/acpi/processor/CPU0/power

active state:            C0

max_cstate:              C1

maximum allowed latency: 2000000000 usec

states:






powertop 설치와 사용 방법은 다음과 같다. 


$ yum install powertop


su 사용자이거나 sudo를 사용해 실행한다.

$ sudo powertop


탭 간 이동은 tab을 이용하고 종료는 q를 누른다. idle 상태를 확인한다. 




Idle stat을 보면 C0로 되어 있는지 여부를 확인할 수 있다. 











여기서 Bad는 실제 c-state과 관련된 설정임을 의미한다. 나쁘다는 의미는 아니다. 



참고 


http://www.tecmint.com/powertop-monitors-linux-laptop-battery-usage/


https://www.scribd.com/document/132381013/Controlling-Processor-C-State-Usage-in-Linux-Nov2012


https://events.linuxfoundation.org/slides/2010/linuxcon2010_brown.pdf



Posted by '김용환'
,



top 커맨드의 메모리 관련 내용(VIRT, RES, SHR, %MEM)를 설명한다.


이를 설명하기 좋은 프로세스는 mongodb인 듯 해서 그 부분만 정리했다. 


실제 메모리를 보기 위해 free 커맨드를 실행하면 cached 메모리 때문에 마치 used 메모리가 상승했다.



$ free

                     total       used              free         shared    buffers     cached

Mem:      16289804   15621900     667904        188     148776    7787380

-/+ buffers/cache:     7685744      8604060

Swap:     10485756          0            10485756




top으로 보면 대략 전체 메모리는 16G이고 사용 중인 메모리는 15G이다. 

VIRT는 12.8G, RES는 6.7G, SHR은 6512로 나타난다. 


$ top

Mem:  16289804k total, 15621300k used,   668504k free,   148776k buffers

Swap: 10485756k total,        0k used, 10485756k free,  7787328k cached


PID USER      PR   NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

17075 www    20   0 12.8g 6.7g 6512 S  0.7        43.2   4321:34 mongod




이것만 보고 정말 물리 메모리를 더 꽂아야 하냐고 묻길래. 아니라고 답변해 주었다. 



top 커맨드의 중요 메모리 설정을 살펴본다.


* VIRT는 프로세스의 가상 크기를 의미한다. 실제로 사용하고 있는 메모리의 총합을 의미한다. VIRT는 
 디스크의 파일을 읽으면서 사용했던 메모리도 포함될 수 있다. VIRT는 프로그램이 현재 얼마나 많은 메모리를 접근할 수 있는지 나타낸다. (즉 물리 메모리의 사용한 공간을 의미하지 않는다.) 


* RES는 실제 물리 메모리를 얼마나 쓰고 있는지 나타낸다. 따라서 VIRT보다는 작은 값을 보여준다.
%MEM의 내용에 연관된다.


* SHR은 VIRT 메모리 중 공유 메모리를 보여준다.



참고로 리눅스에서 물리 메모리 페이지 영역을 볼 수 있다. 
특정 PID의 세그먼트(segment)에 할당된 물리 메모리 페이지를 보여준다.

$ cat /proc/${PID}/smaps
..
7f8248fb2000-7f8249223000 rw-p 00000000 00:00 0
Size:               2500 kB
Rss:                1492 kB
Pss:                1492 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      1492 kB
Referenced:         1488 kB
Anonymous:          1492 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
7f8249223000-7f8249472000 ---p 00000000 00:00 0
Size:               2364 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
7f8249472000-7f824948c000 r-xp 00000000 08:02 1326344                    /usr/java/jdk1.8.0_25/jre/lib/amd64/libzip.so
Size:                104 kB
Rss:                  84 kB
Pss:                  43 kB
Shared_Clean:         60 kB
Shared_Dirty:          0 kB
Private_Clean:        24 kB
Private_Dirty:         0 kB
Referenced:           84 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
...


이 정보의 간략화된 버전이다. 

$ cat /proc/${PID}/maps

7f8248fb2000-7f8249223000 rw-p 00000000 00:00 0
7f8249223000-7f8249472000 ---p 00000000 00:00 0
7f8249472000-7f824948c000 r-xp 00000000 08:02 1326344                    /usr/java/jdk1.8.0_25/jre/lib/amd64/libzip.so





더 깊이 보면 보면 재미있어야 할 내용들 레퍼런스 

1. https://en.wikipedia.org/wiki/Virtual_memory의 address space swapping


2. https://www.youtube.com/watch?v=twQKAoq2OPE


3. https://web.eecs.umich.edu/~pmchen/eecs482/handouts/memory.pdf






Posted by '김용환'
,



"마침표(.)" 커맨드는 쉘이 지정 파일을 읽고 실행할 수 있게 한다. file은 실행 가능한 필요는 없고, 읽을 수 있으면 된다. 또한 쉘은 PATH 변수를 사용하여 file을 찾는다. 서브쉘에 전달되지 않는다.



$ cat varx
AAA=a
BBB=b

$ . varx

$ echo $AAA
a

$ echo $BBB
b






Posted by '김용환'
,

널 커맨드 - :

unix and linux 2017. 2. 23. 08:46




: 커맨드는 본질적으로 널(null) 커맨드이다. 커맨드가 있어야 하는 요구 사항을 충족시키는 데 자주 사용된다.



 if [ $(id -u) != "0" ]; then : ; else echo "superuser"; fi



Posted by '김용환'
,