레이블이 OS DB Etc.인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OS DB Etc.인 게시물을 표시합니다. 모든 게시물 표시

2014년 10월 30일 목요일

우분투에서 PostgreSQL 설치와 환경 설정

[환경]
OS - Ubuntu 14.04.1 LTS
postgresql-9.3


1. 설치

sudo apt-get install postgresql-9.3    *실제 디비

sudo apt-get install pgadmin3           *디비 관리 GUI 툴


2. postgres 계정 리셋

sudo su postgres -c psql template1

*sudo - 시스템 권한
  su     - 권한 변경
  -c      - 커맨드 옵션
  psql   - 쿼리를 실행할 수 있는 프로그램 명령어

  즉 시스템 권한으로 postgres 계정으로 psql 명령을 template1 계정으로 들어가게 실행하라는 뜻


위와 같이 실행하면 postgres=# 형태의 sql 프롬프트가 뜬다.

ALTER USER postgres WITH PASSWORD '1234';
\q

* 디비의 postgres 계정의 패스워드를 1234로 변경
   \q 는 sql 입력 프롬프트 종료

   PostgreSQL 을 설치하면 디비에 postgres 라는 기본 계정이 존재한다.
   그 계정의 비밀번호를 초기화 해주는 과정이다.

sudo passwd -d postgres
sudo su postgres -c passwd

*우분투의 postgres 계정의 패스워드를 설정해주는 과정이다.

   PostgreSQL 을 설치하면 우분투에 postgres 계정 역시 새로 생성된다.


sudo -u postgres createuser -D -A -P myuser
sudo -u postgres createdb -O myuser mydb

* postgres 계정을 이용하여 디비에 myuser 라는 계정을 생성하고,
   mydb 라는 디비도 생성한다.

   [사용된 createuser 옵션]
   -D 옵션은 해당유저가 다른 데이터 베이스를 생성할 수 없도록 제한하는 옵션
   -P 새로 만든 유저의 암호를 바로 설정할 수 있도록 한다.
   -A 는 man 으로 봐도 안나오고 뭔지 정확히^^;;;(아시는분 알려주세요ㅋ)

   [사용된 createdb 옵션]
   -O 생성하는 디비의 소유 유저 설정



사용자 삽입 이미지

만약 로컬에서 접속하는게 아닌 원격에서 접속해야 한다면/etc/postgresql/8.2/main/postgresql.conf를 수정해주어야 합니다.

sudo vi /etc/postgresql/8.2/main/postgresql.conf

이 파일에서 아래의 2줄을  밑에처럼 변경해 줍니다.

#listen_addresses = ‘localhost’
#password_encryption = on

listen_addresses = ‘*’
password_encryption = on

설정읠 변경했다면 sudo /etc/init.d/postgresql-8.2 restart 로 PostgreSQL을 재시작해줍니다.

출처 - http://blog.outsider.ne.kr/377

2014년 10월 24일 금요일

우분투에서 JDK 설치 및 환경변수 설정


<설치>

1. apt-cache search jdk

로 JDK 관련 페키지들이 뭐가 있는지 본다.

2. apt-get install openjdk-7-jdk 면 설치 완료.


설치 위치 - /usr/lib/jvm 에서 ls 치면 나오나 일반적으로 64 bit 에서
                   /usr/lib/jvm/java-7-openjdk-amd64 일 것이다.



<환경설정>

1. 모든 유저에게 적용하려면 /etc/bash.bashrc 의 마지막 줄에

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

를 추가해 준다.

2. 파일을 다시 읽게 하기 위해 source /etc/bash.bashrc 를 실행시켜준다.

*근데 난 환경설정 부분은 안해도 java -version 이 정상적으로 실행된다.
  apt-get install 에서 자동으로 잡아주기다로 한다는 말인가...

2013년 9월 6일 금요일

Apache tomcat 튜닝가이드

톰캣 튜닝
조대협

이번에는 톰캣 서버에 대한 튜닝 옵션에 대해서 한번 알아보자.
애플리케이션 관점에서의 튜닝도 중요하지만, 각 솔루션에 대한 특성을 업무 시나리오에 맞춰서 튜닝하는 것도 못지 않게 중요하다. 여기서 톰캣 튜닝을 설명하는 것은 톰캣 자체에 대한 튜닝 옵션을 소개하는 것도 목적이 있지만, 그보다 업무형태에 따라서 어떠한 접근을 해서 톰캣을 튜닝하는지를 소개하기 위함이다.

가정
여기서 튜닝 하는 톰캣은 HTTP/JSON형태의 REST 형태로 서비스를 제공하는 API 서버의 형태이다. 여러대의 톰캣을 이용하여 REST 서비스를 제공하며, 앞단에는 L4 스위치를 둬서 부하를 분산하며, 서비스는 stateless 서비스로 공유되는 상태 정보가 없다. 

server.xml 튜닝

톰캣의 대부분 튜닝 패러미터는 ${Tomcat_HOME}/conf/server.xml 파일에 정의된다.
몇몇 parameter를 살펴보도록 하자.

Listener 설정

 <Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="root" /> 
이 옵션은 tomcat이 기동할 때, root 사용자이면 기동을 하지 못하게 하는 옵션이다. 서버를 운영해본 사람이라면 종종 겪었을 실수중의 하나가 application server를 root 권한으로 띄웠다가 다음번에 다시 실행하려고 하면 permission 에러가 나는 시나리오 이다. root 권한으로 서버가 실행되었기 때문에, 각종 config 파일이나 log 파일들의 permission이 모두 root로 바뀌어 버리기 때문에, 일반 계정으로 다시 재 기동하려고 시도하면, config 파일이나 log file들의permission 이 바뀌어서 파일을 읽어나 쓰는데 실패하게 되고 결국 서버 기동이 불가능한 경우가 있다. 이 옵션은 이러한 실수를 막아 줄 수 있다.

Connector 설정


protocol="org.apache.coyote.http11.Http11Protocol"
먼저 protocol setting인데, Tomcat은 네트워크 통신하는 부분에 대해서 3가지 정도의 옵션을 제공한다. BIO,NIO,APR 3 가지이다. NIO는 Java의 NIO 라이브러리를 사용하는 모듈이고, APR은 Apache Web Server의 io module을 사용한다. 그래서 C라이브러리를 JNI 인터페이스를 통해서 로딩해서 사용하는데, 속도는 APR이 가장 빠른것으로 알려져 있지만, JNI를 사용하는 특성상, JNI 코드 쪽에서 문제가 생기면, 자바 프로세스 자체가 core dump를 내면서 죽어 버리기 때문에 안정성 측면에서는 BIO나 NIO보다 낮다. BIO는 일반적인 Java Socket IO 모듈을 사용하는데, 이론적으로 보면 APR > NIO > BIO 순으로 성능이 빠르지만, 실제 테스트 해보면 OS설정이나 자바 버전에 따라서 차이가 있다. Default는 BIO이다.

acceptCount="10"
이 옵션은 request Queue의 길이를 정의한다. HTTP request가 들어왔을때, idle thread가 없으면 queue에서 idle thread가 생길때 까지 요청을 대기하는 queue의 길이이다. 보통 queue에 메세지가 쌓였다는 것은 해당 톰캣 인스턴스에 처리할 수 있는 쓰레드가 없다는 이야기이고, 모든 쓰레드를 사용해도 요청을 처리를 못한다는 것은 이미 장애 상태일 가능성이 높다.
그래서 큐의 길이를 길게 주는 것 보다는, 짧게 줘서, 요청을 처리할 수 없는 상황이면 빨리 에러 코드를 클라이언트에게 보내서 에러처리를 하도록 하는 것이 좋다. Queue의 길이가 길면,대기 하는 시간이 길어지기 때문에 장애 상황에서도 계속 응답을 대기를 하다가 다른 장애로 전파 되는 경우가 있다.
순간적인 과부하 상황에 대비 하기 위해서 큐의 길이를 0 보다는 10내외 정도로 짧게 주는 것이 좋다.

enableLookups="false"
톰캣에서 실행되는 Servlet/JSP 코드 중에서 들어오는 http request에 대한 ip를 조회 하는 명령등이 있을 경우, 톰캣은 yahoo.com과 같은 DNS 이름을 IP주소로 바뀌기 위해서 DNS 서버에look up 요청을 보낸다. 이것이 http request 처리 중에 일어나는데, 다른 서버로 DNS 쿼리를 보낸다는 소리이다. 그만큼의 서버간의 round trip 시간이 발생하는데, 이 옵션을 false로 해놓으면 dns lookup 없이 그냥 dns 명을 리턴하기 때문에, round trip 발생을 막을 수 있다.

compression="off"
HTTP message body를 gzip 형태로 압축해서 리턴한다. 업무 시나리오가 이미지나 파일을response 하는 경우에는  compression을 적용함으로써 네트워크 대역폭을 절약하는 효과가 있겠지만, 이 업무 시스템의 가정은, JSON 기반의 REST 통신이기 때문에, 굳이 compression을 사용할 필요가 없으며, compression에 사용되는 CPU를 차라리 비지니스 로직 처리에 사용하는 것이 더 효율적이다.

maxConnection="8192"
하나의 톰캣인스턴스가 유지할 수 있는 Connection의 수를 정의 한다.
이 때 주의해야 할 점은 이 수는 현재 연결되어 있는 실제 Connection의 수가 아니라 현재 사용중인 socket fd (file descriptor)의 수 이다. 무슨 말인가 하면 TCP Connection은 특성상Connection 이 끊난 후에도 바로 socket이 close 되는 것이 아니라 FIN 신호를 보내고, TIME_WAIT 시간을 거쳐서 connection을 정리한다. 실제 톰캣 인스턴스가 100개의Connection 으로 부터 들어오는 요청을 동시 처리할 수 있다하더라도, 요청을 처리하고 socket이 close 되면 TIME_WAIT에 머물러 있는 Connection 수가 많기 때문에, 단시간내에 많은 요청을 처리하게 되면 이 TIME_WAIT가 사용하는 fd 수 때문에, maxConnection이 모자를 수 있다.그래서 maxConnection은 넉넉하게 주는 것이 좋다.
이외에도 HTTP 1.1 Keep Alive를 사용하게 되면 요청을 처리 하지 않는 Connection도 계속 유지 되기 때문에, 요청 처리 수 보다, 실제 연결되어 있는 Connection 수가 높게 된다.
그리고, process당 열 수 있는 fd수는 ulimit -f 를 통해서 설정이 된다. maxConnection을 8192로 주더라도, ulimit -f에서 fd 수를 적게 해놓으면 소용이 없기 때문에 반드시 ulimit -f 로 최대 물리 Connection 수를 설정해놔야 한다.

maxKeepAliveRequest="1"
HTTP 1.1 Keep Alive Connection을 사용할 때, 최대 유지할 Connection 수를 결정하는 옵션이다. 본 시나리오에서는 REST 방식으로 Connectionless 형태로 서비스를 진행할 예정이기 때문에, Kepp Alive를 사용하지 않기 위해서 값을 1로 준다.
만약에 KeepAlive를 사용할 예정이면, maxConnection과 같이 ulimit에서 fd수를 충분히 지정해줘야 하낟.

maxThread="100"
사실상 이 옵션이 가장 중요한 옵션이 아닌가 싶다. 톰캣내의 쓰레드 수를 결정 하는 옵션이다.쓰레드수는 실제 Active User 수를 뜻한다. 즉 순간 처리 가능한 Transaction 수를 의미한다.
일반적으로 100 내외가 가장 적절하고, 트렌젝션의 무게에 따라 50~500 개 정도로 설정하는 게 일반적이다. 이 값은 성능 테스트를 통해서 튜닝을 하면서 조정해 나가는 것이 좋다.

tcpNoDelay="true"
TCP 프로토콜은 기본적으로 패킷을 보낼때 바로 보내지 않는다. 작은 패킷들을 모아서 버퍼 사이즈가 다 차면 모아서 보내는 로직을 사용한다. 그래서 버퍼가 4K라고 가정할때, 보내고자 하는 패킷이 1K이면 3K가 찰 때 까지 기다리기 때문에, 바로바로 전송이 되지 않고 대기가 발생한다.
tcpNoDelay 옵션을 사용하면, 버퍼가 차기전에라도 바로 전송이 되기 때문에, 전송 속도가 빨라진다. 반대로, 작은 패킷을 여러번 보내기 때문에 전체적인 네트워크 트래픽은 증가한다. (예전에야 대역폭이 낮아서 한꺼번에 보내는 방식이 선호되었지만 요즘은 망 속도가 워낙 좋아서tcpNoDelay를 사용해도 대역폭에 대한 문제가 그리 크지 않다.)

Tomcat Lib 세팅

다음으로 자바 애플리케이션에서 사용하는 라이브러리에 대한 메모리 사용률을 줄이는 방법인데, 일반적으로 배포를 할때 사용되는 라이브러리(jar)를 *.war 패키지 내의 WEB-INF/jar 디렉토리에 넣어서 배포 하는 것이 일반적이다. 보통 하나의 war를 하나의 톰캣에 배포할 때는 큰 문제가 없는데, 하나의 톰캣에 여러개의 war 파일을 동시 배포 하게 되면, 같은 라이브러리가 각각 다른 클래스 로더로 배포가 되기 때문에, 메모리 효율성이 떨어진다.
그래서 이런 경우는 ${TOMCAT_HOME}/lib 디렉토리에 배포를 하고 war 파일에서 빼면 모든war가 공통 적으로 같은 라이브러리를 사용하기 때문에 메모리 사용이 효율적이고, 또한 시스템 운영 관점에서도 개발팀이 잘못된 jar 버전을 패키징해서 배포하였다 하더라도, lib 디렉토리의 라이브러리가 우선 적용되기 때문에, 관리가 편하다.
반대로 war의 경우, war만 운영중에 재배포를 하면 반영이 가능하지만, lib 디렉토리의 jar 파일들은 반드시 톰캣 인스턴스를 재기동해야 반영되기 때문에, 이 부분은 주의해야 한다.

JVM Tuning

Java Virtual Machine 튜닝은 java 기반 애플리케이션에서는 거의 필수 요소이다.

-server

제일 먼저 해야할일은 JVM 모드를 server 모드로 전환하는 것이다. JVM 내의 hotspot 컴파일러도 클라이언트 애플리케이션이나 서버 애플리케이션이냐 에 따라서 최적화 되는 방법이 다르다.
그리고 메모리 배치 역시 클라이언트 애플리케이션(MS 워드와같은)의 경우 버튼이나 메뉴는 한번 메모리에 로드 되면, 애플리케이션이 끝날 때 까지 메모리에 잔존하기 때문에 Old 영역이 커야 하지만, 서버의 경우 request를 받아서 처리하고 응답을 주고 빠져서 소멸되는 객체들이 대부분이기 때문에, New 영역이 커야 한다.
이런 서버나 클라이언트냐에 대한 최적화 옵션이 이 옵션 하나로 상당 부분 자동으로 적용되기 때문에, 반드시 적용하기를 바란다.

메모리 옵션

앞에서도 설명하였듯이 JVM 튜닝의 대부분의 메모리 튜닝이고 그중에서도 JVM 메모리 튜닝은 매우 중요하다. 결국 Full GC 시간을 줄이는 것이 관건인데, 큰 요구 사항만 없다면, 전체 Heap Size는 1G 정도가 적당하다. 그리고 New대 Old의 비율은 서버 애플리케이션의 경우 1:2 비율이 가장 적절하다. 그리고 PermSize는 class가 로딩되는 공간인데, 배포하고자 하는 애플리케이션이 아주 크지 않다면 128m 정도면 적당하다. (보통 256m를 넘지 않는다. 256m가 넘는다면 몬가 애플린케이션 배포나 패키징에 문제가 있다고 봐야 한다.)
그리고 heap size는 JVM에서 자동으로 늘리거나 줄일 수 가 있다. 그래서 -Xms와 -Xmx로 최소,최대 heap size를 정할 수 있는데, Server 시스템의 경우 항상 최대 사용 메모리로 잡아 놓는 것이 좋다. 메모리가 늘어난다는 것은 부하가 늘어난다는 것이고, 부하가 늘어날때 메모리를 늘리는 작업 자체가 새로운 부하가 될 수 있기 때문에, 같은 값을 사용하는 것이 좋다.
이렇게 JVM 메모리를 튜닝하면 다음과 같은 옵션이 된다.
-Xmx1024m –Xms1024m -XX:MaxNewSize=384m -XX:MaxPermSize=128m
이렇게 하면 전체 메모리 사용량은 heap 1024m (이중에서 new가 384m) 그리고 perm이 128m가 되고, JVM 자체가 사용하는 메모리가 보통 300~500m 내외가 되서 java process가 사용하는 메모리 량은 대략 1024+128+300~500 = 대략 1.5G 정도가 된다.

32 bit JVM의 경우 process가 사용할 수 있는 공간은 4G가 되는데, 이중 2G는 시스템(OS)이 사용하고 2G가 사용자가 사용할 수 있다. 그래서 위의 설정을 사용하면 32bit JVM에서도 잘 동작한다.
64 bit JVM의 경우 더 큰 메모리 영역을 사용할 수 있는데, 일반적으로 2G를 안 넘는 것이 좋다.(최대 3G), 2G가 넘어서면 Full GC 시간이 많이 걸리기 시작하기 때문에, 그다지 권장하지 않는다. 시스템의 가용 메모리가 많다면 Heap을 넉넉히 잡는 것보다는 톰캣 인스턴스를 여러개 띄워서 클러스터링이나 로드밸런서로 묶는 방법을 권장한다.

OutOfMemory

자바 애플리케이션에서 주로 문제가 되는 것중 하나가 Out Of Memory 에러이다. JVM이 메모리를 자동으로 관리해줌에도 불구하고, 이런 문제가 발생하는 원인은 사용이 끝낸 객체를release 하지 않는 경우이다. 예를 들어 static 변수를 통해서 대규모 array나 hashmap을reference 하고 있으면, GC가 되지 않고 계속 메모리를 점유해서 결과적으로 Out Of Memory에러를 만들어낸다.
Out Of Memory 에러를 추적하기 위해서는 그 순간의 메모리 레이아웃인 Heap Dump가 필요한데, 이 옵션을 적용해놓으면, Out Of Memory가 나올때, 순간적으로 Heap Dump를 떠서 파일로 저장해놓기 때문에, 장애 발생시 추적이 용이하다.
-XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof

GC 옵션

다음은 GC 옵션이다. Memory 옵션 만큼이나 중요한 옵션인데, Parallel GC + Concurrent GC는 요즘은 거의 공식처럼 사용된다고 보면 된다. 이때 Parallel GC에 대한 Thread 수를 정해야 하는데, 이 Thread수는 전체 CPU Core수 보다 적어야 하고, 2~4개 정도가 적당하다.
-XX:ParallelGCThreads=2 -XX:-UseConcMarkSweepGC
GC 로그 옵션
그리고 마지막으로 GC Log 옵션이다. 서버와 JVM이 건강한지 메모리상 문제는 없는지 GC 상황은 어떻게 디는지를 추적하려면 GC 로그는 되도록 자세하게 추출할 필요가 있다. GC로그를 상세하게 걸어도 성능 저하는 거의 없다.
-XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -XX:-TraceClassUnloading -XX:-TraceClassLoading

마지막에 적용된 TraceClassLoading은 클래스가 로딩되는 순간에 로그를 남겨준다. 일반적으로는 사용하지 않아도 되나, OutOfMemory 에러 발생시 Object가 아니라 class에서 발생하는 경우는 Heap dump로는 분석이 불가능 하기 때문에, Out Of Memory 에러시 같이 사용하면 좋다.

지금까지 간략하게 나마 톰켓 솔루션에 대한 튜닝 parameter 에 대해서 알아보았다. 사실 이러한 튜닝은 일반적인 개발자에게는 힘든 일이다. 해당 솔루션에 대한 많은 경험이 있어야 하기 때문에, 이런 parameter는 vendor의 기술 지원 엔지니어를 통해서 가이드를 받고, 성능 테스트 과정에서 최적화를 하고 표준화된 parameter를 정해서 사용하는 것이 좋다. Apache Tomcat의 경우에도 오픈소스이기는 하지만, Redhat등에서 기술 지원을 제공한다.

2013년 9월 2일 월요일

Maven lib 를 제대로 잡지 못하는 경우

maven 프로젝트 생성 후 mvn:install 은 정상적으로 실행된다.
Server > tomcat > webapp 를 publishing 한 후 실행하면 참고 lib를 못차는 error 발생
Project > properties > Deployment Assembly > add > java Build Path Entries > Manven Dependncies 를 추가한다.




2012년 10월 10일 수요일

PostgreSQL 메뉴얼


PostgreSQL에 대하여 공부하려는데... 자료가 너무 없다..

그나마 제일 깔끔하게 정리된 곳이 이 곳인듯하여 남긴다.

http://wiki.openyourmind.kr/bin/view/Postgres/WebHome


시간 된다면 정리해봐야지...

Ubuntu Server(linux) 인터넷 연결하기


1. 우선 dhcp안쓰는 경우, 즉 고정아이피 쓰는 경우
다른 과정 다 생략하고 걍 랜카드 찾는 과정만 보면..
sudo lshw - class network
써주면 된다.
그럼 약 5초정도 기다리면 연결된 랜카드 정보가 뜨는데
product와 logical name으로 어떤 랜카드가 어떤 logical name을 갖고 있는지 알 수 있다.
(참고로 랜카드 드라이버는 이미 설치 돼 있다고 가정하고 진행하겠다. 요새 웬만한 랜카드 드라이버는 다 잡아주니까..)

유선랜의 경우 대부분의 logical name은 eth0 으로 돼있을 것이다.
나의 경우는
product: 88E8040 PCI-E Fast Ethernet Controller
vendor: Marvel Technology Group Ltd.
...
logical name: eth0

으로 돼있었다.
이제 고정아이피로 인터넷을 잡아보자

조낸 간단하다.
다음과 같이 ifconfig를 이용해서 ip와 netmask를 잡는다.
sudo ifconfig eth0 10.0.0.100 netmask 255.255.255.0

저기 eth0과 10.0.0.100과 255.255.255.0의 경우 각자 자기한테 맞는걸 써줘야 할 것이다.
그리고 이제 gateway를 잡자.
sudo route add default gw 10.0.0.1 eth0

위와 같이 써주면 게이트웨이가 잡힌다.

제대로 잡혔는지 확인하기 위해 route -n 을 입력해 주면 입력한 게이트웨이가 보인다.

이제 DNS를 잡아보자.
DNS를 잡기 위해 /etc/resolv.conf 를 연다. 참고로 나의 경우 이 파일이 없어서 내가 생성 하였다.
당연히 sudo vi /etc/resolv.conf 로 열였다.

그리고 아래와 같은 형식으로 dns를 써준다.
nameserver 8.8.8.8
nameserver 8.8.4.4

그럼 잘 된다~
이렇게 하면 인터넷이 잘 될텐데 난 왠지 불안해서 그냥 
sudo /etc/init.d/networking restart 를 한 번 해주었다.
인터넷이 잘 되는지 안 되는지 알려면 google로 핑을 쏴보면 된다.
ping www.google.com

p.s>이제 각종 패키지를 깔기 위해 sudo apt-get update 를 해주면 초반 세팅 완료 후후후

2. dhcp를 사용 하는 경우(ip 자동 할당)
조낸 간단하다.
/etc/network/interfaces를 연다
즉,  sudo vi /etc/network/interfaces를 한다.

아, 물론 이 과정을 하기 전에 backup 하는 건 잊지 말자
cp interfaces interfaces.backup

그리고 파일의 제일 하단에 다음과 같이 적는다.
auto eth0
iface eth0 inet dhcp

그리고 저장하고 나와서
다음을 입력한다.
sudo ifup eth0

위와 같이 입력해주면 아이피를 할당 받는다.
ifconfig를 해보면 eth0에 ip가 할당 돼 있는 것을 볼 수 있다.
반대로 sudo ifdown eth0 할 경우 할당된 ip가 해제되며, ifconfig하면 eth0이 사라져 있을 것이다.
dhcp에서 ip를 무사히 할당받았다면
DHCPDISCOVER on teh0 to ~~~~~ port ~~ interval ~ 이후
DHCPOFFER of ~~~ from ~~~
라며 아이피를 할당 받을 것이다.

출처 - http://roter.pe.kr/195

리눅스에서 USB 사용법


USB Storage(USB메모리 디스크)를 장착하면 잠시후에 자동으로 인식하게 된다.
이렇게 안될 경우에는 Menual방식으로 드라이버를 Loading해야만 사용할 수 있다.
USB Storage는 Linux에서 SCSI디스크로 인식하기 때문에 등록한 후에는
fdisk를 통해서 확인하면 SCSI디스크의 Target Name이 나타나는 것을 확인할 수 있다.

1. lsmod를 통해서 현재 드라이버확인
usb-uhci/usb-storage가 로딩되어 있는지 확인한다.
Module                  Size  Used by    Not tainted
i830                   72024   1
agpgart                57752  11  (autoclean)
usbserial              23580   0  (autoclean) (unused)
parport_pc             18756   1  (autoclean)
lp                      8964   0  (autoclean)
parport                36832   1  (autoclean) [parport_pc lp]
autofs4                15928   0  (autoclean) (unused)
ds                      8576   2
yenta_socket           13792   2
pcmcia_core            56800   0  [ds yenta_socket]
audit                  89816   3
8139too                17384   0
mii                     3956   0  [8139too]
crc32                   3712   0  [8139too]
sg                     36204   0  (autoclean)
sr_mod                 17784   2  (autoclean)
microcode               5688   0  (autoclean)
ide-scsi               12336   1
scsi_mod              106408   3  [sg sr_mod ide-scsi]
ide-cd                 33920   0
cdrom                  32416   0  [sr_mod ide-cd]
keybdev                 2944   0  (unused)
mousedev                5524   1
hid                    22116   0  (unused)
input                   5888   0  [keybdev mousedev hid]
ehci-hcd               20008   0  (unused)
usb-uhci               25740   0  (unused)
usbcore                77376   1  [usbserial hid ehci-hcd usb-uhci]
ext3                   85736   2
jbd                    50604   2  [ext3]
2. USB 드라이버를 Loading한다.
Linux:/>/sbin/modprobe usb-storage (USB Flash Memory DISK)
[Hancom Linux 4.0]에서는 /sbin/modprobe usb_storage


3. USB드라이버 Loading후에 디스크 드라이브 확인
USB드라이버를 Loading한 후에 실제로 USB메모리 디스크가 Linux O/S에서
인식했는지 확인하는 절차이다. 3가지의 방식으로 확인해 본다.1) FDISK를 사용한 확인   fdisk -l을 하면 USB디스크가 SCSI디바이스로 인식한다.
  ROOT/> fdisk -l
  Disk /dev/sda: 521 MB, 521142272 bytes
  32 heads, 32 sectors/track, 994 cylinders
  Units = cylinders of 1024 * 512 = 524288 bytes
      Device Boot    Start       End    Blocks   Id  System
  /dev/sda1   *         1       994    508912    6  FAT16
   Disk /dev/hda: 60.0 GB, 60011642880 bytes
  255 heads, 63 sectors/track, 7296 cylinders
  Units = cylinders of 16065 * 512 = 8225280 bytes
      Device Boot    Start       End    Blocks   Id  System
      /dev/hda1   *         1      3824  30716248+   7  HPFS/NTFS
   /dev/hda2          3825      7296  27888840    f  Win95 Ext'd (LBA)
   /dev/hda5          3825      6374  20482843+   7  HPFS/NTFS
   /dev/hda6          6375      6387    104391   83  Linux
   /dev/hda7          6388      6518   1052226   82  Linux swap
   /dev/hda8          6519      7296   6249253+  83  Linux
 2) LOG Message를 통한 확인
   로그메시지를 확인하면 SCSI 디바이스로 인식한 것을 확인할 수 있다.
   tail -n 7 /var/log/messages
   Sep 22 17:27:26 localhost kernel: SCSI device sda: 1017856 512-byte hdwr sectors (521 MB)
   Sep 22 17:27:26 localhost kernel: sda: Write Protect is off
   Sep 22 17:27:26 localhost kernel:  sda: sda1
   Sep 22 17:27:26 localhost kernel: SCSI device sda: 1017856 512-byte hdwr sectors (521 MB)
   Sep 22 17:27:26 localhost kernel: sda: Write Protect is off
   Sep 22 17:27:26 localhost kernel:  sda: sda1
   Sep 22 17:27:27 localhost devlabel: devlabel service started/restarted
 3) PROC을 통한 확인    USB드라이버가 로딩이 되면 PROC의 SCSI밑에 usb-storage-0가 등록이 된다.
   그 디렉토리에서 보면 파일 1이 생성되어 있는 것을 볼 수 있다.
   이 파일에 현재 USB storage의 내용이 나타난다. 아래에 보면 현재 Attached가 Yes로 되어
   있는 것을 확인 할 수 있다.
   Linux/> ls /proc/scsi
   ide-scsi   scsi   sg   usb-storage-0
   Linux/> cat /proc/scsi/usb-storage-0/1
      Host scsi1: usb-storage
          Vendor: Imation
         Product: Flash Drive
   Serial Number: 21110499738793
        Protocol: Transparent SCSI
       Transport: Bulk
            GUID: 071800830021110499738793
        Attached: Yes
    [Hancom Linux 4.0]에서는 /proc/scsi/usb-storage/1로 생성된다.

4.  USB드라이버의 마운트Linux:/> mount /dev/sda1 /mnt/flash
  Device Boot    Start       End    Blocks   Id  System
/dev/hda1   *         1      3824  30716248+   7  HPFS/NTFS
/dev/hda2          3825      7296  27888840    f  Win95 Ext'd (LBA)
/dev/hda5          3825      6374  20482843+   7  HPFS/NTFS
/dev/hda6          6375      6387    104391   83  Linux
/dev/hda7          6388      6518   1052226   82  Linux swap
/dev/hda8          6519      7296   6249253+  83  Linux
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda8             5.9G  4.4G  1.2G  79% /
/dev/hda6              99M  9.0M   85M  10% /boot
none                  246M     0  246M   0% /dev/shm
/dev/sda1             497M  3.5M  494M   1% /mnt/flash


5. USB 스토리지 사용하지 않을 경우 순서
1) sync;sync; umount /dev/sda1
2) modprobe -r usb-storage
[Hancom Linux 4.0]에서는 /sbin/modprobe -r usb_storage





출처 - http://katalog.egloos.com/2524010

리눅스 터미널에서 인터넷 자료 다운로드 받기

리눅스 초보인 필자는 리눅스에 특정 프로그램을 설치하고 싶은데,
어떻게 내가 원하는 홈페이지에 가서 내가 원하는 파일을 다운로드 받는지 혼란스러워하다가 그나마 대책을 알아냈다.


1. 파일 다운로드 받을 주소를 알아낸다.
(필자의 경우 편하게 인터넷에서 파일주소를 알아냈다.)


2. 터미널에서 wget http://linux/redhat9.0/simon 라고 친다.




아... 쉽다...-_-;


2012년 9월 10일 월요일

Optimizer

Optimizer 란?


Optimizer 란 SQL 을 해석하고 실행계획을 수립 한 후, 이를 통해 데이터를 처리하는 프로세스이다.

Optimizer는 ㅋRBO(Rule Based Optimizer)와 CBO(Cost Based Optimizer) 두 종류가 있다.

자신의 Optimizer가 어떻게 설정되어있는 지 보려면
----------------
SELECT NAME, VALUE, ISDEFAULT, ISMODIFIED, DESCRIPTION
FROM V$PARAMETER
WHERE NAME LIKE '%optimizer_mode%';
----------------

을 실행하며 된다.

RBO - 특정한 규칙에 의해 실행계획을 세운다.
CBO - 통계정보에의해 비용을 계산하여, 작은 비용이 나오는 방향으로 실행계획을 세운다.





Optimizer_mode의 종류


① CHOOSE     - v9i까지의 기본값 
  - 통계정보의 따라 CBO를 이용할지 RBO를 이용할지 선택한다. 통계정보가 전혀 없을때는 RBO를 선택하고, 통계정보가 일부라도 존재할때는 CBO를 선택하게 된다.

② ALL_ROWS   - Cost Base임을 뜻함 (v10g의 기본값) 
  - CBO의 한 종류로 큰 데이터 처리에 적합하다. 

③ FIRST_ROWS - Cost Base임을 뜻함 
  - CBO의 한 종류로 작은 데이터 처리에 적합하다. 

④ RULE       - Rule Base임을 뜻함


*테이블에 통계정보를 생성하기 위해서는 아래명령을 실행시키면 된다.

SQL> ANALYZE TABLE [테이블이름] COMPUTE STATISTICS ;





2012년 9월 7일 금요일

SVN Ignore - 특정 서버에 독립적으로 속해있는 파일들을 svn update나 commit으로부터 보호


svn을 도입해서 버전별로 조금씩 다른 웹 사이트를 구성한다고 할 때, 어떻게 하면 될까?

dev staging production server 각각의 웹 사이트마다 고유의 독특한 설정값들이 담기는 파일들이 있는데, 이들 파일들은 svn repository와의 상호작용을 멈추게 하고 싶다. 어떻게?

물론, 가장 확실하고 안심할 수 있는 방법은, 그런 설정파일들은 따로 빼내어 svn 트리 밖에 놓는 것이다. 그렇게 되도록 프로그램을 짜는 것이, 가장 정확한 방법이다.

하지만, 세상 일이라는 게 어디, 그렇게 내 맘처럼 항상 정확하게 돌아가 주진 않는 법이다. 때론 샛길이거나 편법이라도 찾아야 한다.

우선, 레파지토리로부터 처음 checkout해서 내려받은 다음, 설정파일들은 꼭 필요하지 않더라도 약간 편집해서 새로 저장한다. 그러면, 일단 레파지토리로부터 svn update 명령을 수행할 때 영향을 받지 않는다. 하지만, 이건 미봉책이다. 만약 다른 곳에서 그 파일 내용을 레파지토리에 수정본으로 올리게 되면, 레파지토리의 파일이 더 나중의 변경 시간을 가지게 되므로, 그 이후에는 svn update 의 영향권에 놓이게 된다.

또 하나 지켜야 할 것은, 설정파일이 포함된 디렉토리 전체를 svn commit을 하지 말아야 한다. 아마도 다른 서버의 설정파일들에 svn update의 압박이 가해질 것이기 때문이다.

이런, 원시적인, 조심성 말고는 정말 방법이 없는 걸까? 어쩌면, svn의 어떤 속성값 들 가운데, ‘난 빼줘’를 지정하는 게 있을 법 하지 않을까?

있다. 바로 svn ignore 속성이다. 원래는, 백업 파일이나 임시 파일, 컴파일된 바이너리 파일들을 제외하기 위해 설정하는 속성이다. 이 속성을 활용하면, svn update svn commit으로 부터 ‘안전’하게 설정파일들을 보호할 수 있다.

ZF(Zend Framework)의 설정파일이 있는 application/configs 폴더에서 svn:ignore *’ 를 걸어보자.

$ svn propset svn:ignore '*' .
$ svn proplist                                                   <—혹시, 설정된 속성 있는지 리스팅
Properties on '.':
  svn:ignore

*’이 너무 심하다고 생각하면, *.ini’를 콕 찍어서 속성값을 설정해줘도 된다.

$ svn propset svn:ignore '*.ini' configs/
$ svn propget svn:ignore configs/
*.ini

만약, 설정이 맘에 안들면, 아래 명령으로, 수정할 수도 있다. 이 때, 갑자기 vi 편집기가 뜬다. 놀라지 말기를…

$ svn propedit svn:ignore configs/

, 그런데, 약간의 문제가, 있다… 이게 이 서버에서만 ignore 되면 좋은데, svn:ignore 속성이 레파지토리에 올라가면 어떻게 될까?

svn commit 을 해보니, 덜컥 아까 svn:ignore 속성을 줬던 디렉토리와 파일이 변경된 리스트에 올라와 있다. 흠… 이건, 좀더 실험이 필요하겠다.

[가장 무난하고 확실한 해결 방법: .default 파일을 사용]

보통 설정 파일들은, 데이터베이스 접속 암호와 같은 아주 비밀스런 정보를 담고 있다. 이 정보들이 그대로 svn 레파지토리에 올라가 있는 건 바람직하지 않다. 그래서 취할 수 있는 방법이 default 파일을 따로 만들어서 레파지토리에는 그걸 올리는 거다.

configs/database.ini 파일이 있다고 생각해보자. 이 파일은 데이터베이스 접속 암호를 담고 있다. 이건 레파지토리에 올리고 싶지 않다. svn:ignore 설정을 해서 제외해준다. svn propset svn:ignore database.ini configs/

새로 소스를 checkout 받으면 database.ini 파일은 없다. 레파지토리에 없으니까. 하지만, 프로그램을 작동시키려 하면, 데이터베이스 접속이 안된다. 이 때 잘 모르는 사람은 당황한다.

이런 문제를 해결하기 위해서, 일종의 템플릿 파일처럼 참조 가능한 파일을 만들어서 레파지토리에 올려둔다. database.ini.default 정도의 이름을 가지면 금방 알아볼 수 있겠다. 당연히 기본 골격은 database.ini 파일의 내용과 동일하고, 데이터베이스 접속 암호 같은 기밀 정보 부분은 설명 문구 정도로 채워두면 된다.

위와 같이 해두면, 새로 소스를 checkout 받을 때, configs/database.ini.default 파일이 내려온다. 이 파일을 복사해서 database.ini 파일을 만들고, 데이터베이스 접속 암호 부분을 실제에 맞게 수정한다. 이 때 svn update를 실행하면, 아무런 변화가 없다. 왜냐하면, 새로 만들고 변경한 configs/database.ini 파일은 이미 configs/ 폴더에서 svn:ignore로 설정되어 있어서 무시되기 때문이다.

작업 순서를 다시 설명하면, 아래와 같다.
1.  처음에 레파지토리에 올리기 위한 소스 코드를 준비할 때, database.ini 파일이 있다면 그걸 안전한 다른 폴더로 백업본을 하나 복사한다.
2.  database.ini 파일의 이름을 database.ini.default로 변경한다.
3.  database.ini.default 파일을 편집기로 열어서, 기밀 정보에 해당하는 부분은 설명 문구 등으로 대체한다.
4.  svn propset svn:ignore database.ini 를 실행한다.
5.  svn import 를 실행한다. 또는 이미 레파지토리에 연결된 폴더에서 라면, svn commit을 실행한다.

새로 checkout으로 내려 받아서 작업하는 순서는 아래와 같다.
1.  svn checkout 한다.
2.  database.ini.default 파일을 database.ini 파일로 복사한다. 이 때 복사하지 않고 파일 이름만 변경하면 안된다. database.ini.default 파일은 계속 남아있어야 한다. 만약, import 단계에서 백업으로 따로 보관해두었던 database.ini 파일이 있었다면, 그냥 그 파일을 가져와도 된다.
3.  database.ini 파일을 편집기로 열어서 필요한 내용을 수정한다.
4.  작업 끝~


--------------------------------------------------