yum.repos.d]# yum list | grep python
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 309, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 178, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 345, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 101, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 112, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 662, in 
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 502, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 260, in populateSack
    sack.populate(repo, mdtype, callback, cacheonly)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 168, in populate
    if self._check_db_version(repo, mydbtype):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 226, in _check_db_version
    return repo._check_db_version(mdtype)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1226, in _check_db_version
    repoXML = self.repoXML
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1399, in 
    repoXML = property(fget=lambda self: self._getRepoXML(),
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1391, in _getRepoXML
    self._loadRepoXML(text=self)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1381, in _loadRepoXML
    return self._groupLoadRepoXML(text, ["primary"])
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1365, in _groupLoadRepoXML
    if self._commonLoadRepoXML(text):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1201, in _commonLoadRepoXML
    result = self._getFileRepoXML(local, text)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 974, in _getFileRepoXML
    cache=self.http_caching == 'all')
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 811, in _getFile
    http_headers=headers,
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 412, in urlgrab
    return self._mirror_try(func, url, kw)
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 398, in _mirror_try
    return func_ref( *(fullurl,), **kwargs )
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 936, in urlgrab
    return self._retry(opts, retryfunc, url, filename)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 854, in _retry
    r = apply(func, (opts,) + args, {})
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 922, in retryfunc
    fo = URLGrabberFileObject(url, filename, opts)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1010, in __init__
    self._do_open()
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1093, in _do_open
    fo, hdr = self._make_request(req, opener)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1202, in _make_request
    fo = opener.open(req)
  File "/usr/lib64/python2.4/urllib2.py", line 358, in open
    response = self._open(req, data)
  File "/usr/lib64/python2.4/urllib2.py", line 376, in _open
    '_open', req)
  File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.4/site-packages/M2Crypto/m2urllib2.py", line 82, in https_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "/usr/lib64/python2.4/httplib.py", line 810, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib64/python2.4/httplib.py", line 833, in _send_request
    self.endheaders()
  File "/usr/lib64/python2.4/httplib.py", line 804, in endheaders
    self._send_output()
  File "/usr/lib64/python2.4/httplib.py", line 685, in _send_output
    self.send(msg)
  File "/usr/lib64/python2.4/httplib.py", line 652, in send
    self.connect()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/httpslib.py", line 55, in connect
    sock.connect((self.host, self.port))
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 174, in connect
    ret = self.connect_ssl()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 167, in connect_ssl
    return m2.ssl_connect(self.ssl, self._timeout)
M2Crypto.SSL.SSLError: tlsv1 alert protocol version

 

 

repo 등록돼있는 URL중 지원하지않는 centos5의 ssl 버전때문이다.

설치해야하는 레포때문에 문제가 나는거라면 ssl 새로 설치해서 yum을 새로 설치한 ssl을 참조하도록 하거나(당연히 yum을 컴파일 설치해야함)

설치에 필요하지 않는 레포때문에 문제가 나는거라면 그냥 그 레포 삭제해버리면 된다.
ㄴ나는 dell 레포때문에 문제가 났었는데 dell 레포 필요하지 않아서 삭제해버림

'job > linux' 카테고리의 다른 글

sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
서버 점검..  (0) 2019.06.11
nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21

scrtipt_dist]# ansible-playbook dist.yml

PLAY [all] ******************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
fatal: [서버 아이피 ]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 서버 아이피closed.\r\n", "module_stdout": "  File \"/root/.ansible/tmp/ansible-tmp-1556259206.06-242213350336107/AnsiballZ_setup.py\", line 39\r\n    with open(module, 'wb') as f:\r\n            ^\r\nSyntaxError: invalid syntax\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
        to retry, use: --limit @/root/ansible/scrtipt_dist/dist.retry

PLAY RECAP ******************************************************************************************************************************************************************
1.234.83.50                : ok=0    changed=0    unreachable=0    failed=1    skipped=0  

 

 

위와같은 에러가 발생

 

원인은 파이썬 버전이 낮아서 그렇다고 한다.

엔서블 2.4 버전부터는 파이썬 2.4/2.5 버전에 대한 지원을 하지 않는다고 한다. 따라서 파이썬 2.6버전 이상으로 올려야 된다.

 

위의 내용까지가 구글링하면 깃헙이나 스택오버플로우에 나왔던 내용이다... 한글문서로도 있었고...

근데 클라이언트의 파이썬 버전까지 맞춰야하는줄은 몰랐다.

 

엔써블 처음 접할 때 클라이언트는 ssh 접속만 되면 된다했건만... 여튼...

클라이언트(cent5버전)에 yum 으로 파이썬 2.6 설치(기존 파이썬은 냅두고...)후

엔써블 옵션을 ansible_python_interpreter=/usr/bin/python2.6 추가하였더니 잘 된다.

'job > ansible' 카테고리의 다른 글

ansible 공부한 모듈들 정리  (0) 2019.05.02
ansible - 디렉토리 구조  (0) 2019.05.02
ansible-3 playbook  (0) 2019.04.25
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22
ansible-1  (0) 2019.04.10

playbook 이란

각본이라고 나오는데 작업계획서 ??같은거다.

예를들어 서버에 apache를 설치할 때

1.아파치를 다운로드 받고

2.압축풀고

3.소스설치하고 등등

작업들을 나열한 파일(이름.yml)을 플레이북이라 하고 playbook에 입력돼있는 모듈, 작업들을 순차적으로 진행한다.

yaml로 짜여져있어서 첫줄에는 --- 을 적어야한다.

 

그리고 -name: 작업이름을 적어준다. 여기서 : 이거 뒤에 스페이스로 한칸 뛰어야한다. 야믈 문법은 계속 공부하면서 읶혀야할듯

##name은 필수가 아니다. 다만 무조건 적는 습관을 들이자. playbook 실행시 어느 구간이 작업되고 있는지 확인할 수 있고 다른사람이 볼때도 쉽게 알아야 하니까.

 

 

아래는 /root/test.txt 라는 파일을 /root/test.txt_ori로 옮기고(만약 /root/test.txt가 없을경우는 무시)

/root/ansible/template/test.j2를 /root/test.txt로 업로드하는 플레이북이다.

 

--- ## 첫줄은 무조건 --- 적어줘야한다. yml 명시
- hosts: all ## 작업 대상은 /etc/ansible/hosts에 적혀있는 모든 서버들, : 땡땡 뒤에는 므조건 스페이스로 한칸 띄어줘야 한다. 
  remote_user: root  ##맨앞에는 스페이스로 두칸 띄어주고
  tasks: ##마찬가지로 여기도 맨앞에는 스페이스로 두칸 띄어주고
  - name: centos 5 version mv test.txt test.txt_ori   
    shell: bash -c 'mv /root/test.txt /root/test.txt_ori'   ###이번에는 4칸. 들여쓰기 해줘야됨. / root/test.txt 라는 파일을 /root/test.txt_ori로 옮긴다.
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == '6' ###서버 os가 centos 6버전일때만
    ignore_errors: True ###/root/test.txt 가 서버에 없으면 에러발생하고 그다음작업 진행을 안한다. ignore_errors:True 해야지 /root/test.txt 가 없어도 무시하고 다음작업을 진행한다.
  - name: centos 5 version new test.txt upload | Template test.txt
    template: src="/root/ansible/template/test.j2" dest="/root/test.txt" force=yes owner=root group=root mode="0644" ##test.txt 새로 업로드

'job > ansible' 카테고리의 다른 글

ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22
ansible-1  (0) 2019.04.10
ansible 공부  (0) 2018.10.10

그룹관리

/etc/ansible/group_vars 하위에다가 그룹-그룹 그룹-변수 지정도 가능하다.

ansible]# cat /etc/ansible/hosts              
[nginx]
1.1.1.1         ansible_user=root       ansible_ssh_pass='qlqjs'
[apache]
2.2.2.2         ansible_user=root       ansible_ssh_pass='qlqjs'

파일 내용은 위와같고

ansible]# ansible all -m shell -a "df -h" --list-hosts
  hosts (2):
    1.1.1.1 
    2.2.2.2

 

ansible]# ansible nginx -m shell -a "df -h"   
1.1.1.1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       235G   37G  187G  17% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/sda1       200M  120M   70M  64% /boot

 

ansible]# ansible all -m shell -a "df -h"     
2.2.2.2 | FAILED | rc=-1 >>
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

1.1.1.1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       235G   37G  187G  17% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/sda1       200M  120M   70M  64% /boot

 

##
-m 옵션은 어떤 모듈을 선택할지..

yum, service, shell등 많다. -m 옵션의 기본값은 shell 이다. 다만 남들이 좀 더 보기 편하게 shell도 써주기

다만 위 명령들은 ansible 단일명령? 뭐 그런느낌이다. 에드혹이라고 하는듯. 대부분 플레이북을 이용해 사용한다.

-------여기까지가 가장 기본적인 ansible 사용법------------

 

----멱등성-----

엔서블하면 멱등성이 꼭 나온다.
멱등성이란 연산을 여러번 적용해도 결과가 달라지지 않는 성질인데 엔서블이 멱등성을 지원한다.
난 이부분이 처음에 굉장히 헷갈렸다. 도대체 어떻게 무조건 값이 같을 수 있지 ??근데 최대한 멱등성을 지원하려고 노력한다는거지(대부분의 모듈들이) 멱등성을 지원하지 않을수도 있다. 

여튼.. 멱등성이 뭔지 예를들자면 lineinfile 이란 모듈이 있다. 이 모듈은 echo "문구" >> 파일.txt 와 같이 파일에 내용을 추가하는 모듈인데...ansible -m lineinfile "path=test.txt line=test11" 이런식으로 애드혹를 입력할경우 test.txt 하단에 test11이라는 구문이 추가된다.  근데 사람이 실수로 ansible -m lineinfile "path=test.txt line=test11" 이런 명령어를 두번 넣었을경우 lineinfile은 멱등성을 지원하기 때문에 해당 파일에 test11 이 두줄 추가 되지 않고 한줄만 추가된다. 

반대로 shell 이라는 모듈을 통해 입력을 하면 당연히 test11이 두줄 추가 돼겠지. 이경우는 멱등성이 지원되지 않은거다.

'job > ansible' 카테고리의 다른 글

ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-3 playbook  (0) 2019.04.25
ansible-1  (0) 2019.04.10
ansible 공부  (0) 2018.10.10

innodb 의 경우 instert 속도가 myisam에 비해 느리다.

 

이경우 여러가지 튜닝을 할 수 있는데 대표적인것만 몇개 수정, 비교 해보려고 한다.

1.innodb_flush_log_at_trx_commit 를 0으로 변경하면 속도를 많이 올릴 수 있다고 한다.
innodb_flush_log_at_trx_commit 란...
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html

 

MySQL :: MySQL 8.0 Reference Manual :: 15.13 InnoDB Startup Options and System Variables

MySQL 8.0 Reference Manual  /  The InnoDB Storage Engine  /  InnoDB Startup Options and System Variables 15.13 InnoDB Startup Options and System Variables System variables that are true or false can be enabled at server startup by naming them, or disabled

dev.mysql.com

요약하자면

innodb_flush_log_at_trx_commit 이란 쿼리 요청이 디스크에 저장되는 방법이 지정된 변수이다. 즉 이 값을 변경하면 트랜잭션 방법을 수정해서 insert 속도를 올릴 수 있따.

##트랜잭션, commit이란

먼저 DB에서의 트랜잭션이란 정상적으로 완료된 일련의 작업들이라고 생각하면된다. 예를들어 insert , update , delete가 순차적으로 일어나고 그후 commit을 하게되면 트랜잭션이 정상적으로 완료됐다할 수 있다. 즉 commit이란 저장되지 않은(메모리에 적혀있는)데이터를 디비에 저장 후 트랜잭션을 종료한다.

 

innodb_flush_log_at_trx_commit  값이 디폴트일때의 과정(즉 1일 때)은 아래 처럼 진행된다.

쿼리 하나당 [log buffer(메모리 영역)를 거쳐서 >os buffer/cache(메모리 영역)를 거쳐서  > 마지막으로 ib_logfile(디스크영역)에 저장(flush) 된다.] 즉 1회 요청당 1회 commit - 한번의 요청때마다 매번 commit을 진행한다. - (요게 핵심임)


0 또는 2로 바꾼다면 저 과정이 간략해진다.

innodb_flush_log_at_trx_commit  =0
쿼리 하나당 [log buffer(메모리 영역)저장]하고 1초에 한번씩 나머지 commit을 수행(os buffer/cache(메모리 영역)를 거쳐서  > 마지막으로 ib_logfile(디스크영역)에 저장(flush)])

innodb_flush_log_at_trx_commit  = 2

쿼리 하나당 [log buffer(메모리 영역)를 거쳐서 >os buffer/cache(메모리 영역)에 저장] 후 1초에 한번씩 나머지 commit을 수행ib_logfile(디스크영역)에 저장(flush)])

 

즉 0과 2의 차이는 쿼리하나당 log buffer까지 저장하느냐 os buffer/cache 까지 저장하느냐의 차이임

 

(혹시 이글을 읽으시는 분들중 틀린 내용이 있다면 제발 코멘트 부탁드립니다. 구글링하면서 다른 내용이 적잖이 보여서 사실 저도 좀 헷갈립니다.)

 

이론적으로 보면 속도 순서는 0 - 2 -1 순으로 빨라야 한다. 

비교를 해보자.

파일용량(각각 실 사용 데이터) 0일때 1일때 2일때
12GB 45분 60분 50분
10GB 40분 50분 45분
15GB 65분 80분 65분
18GB 75분 95분 75분
14GB 테스트 안함 75분 60분
19GB 테스트 안함 105분 85분
19GB 테스트 안함 105분 85분

0이랑 2랑 거의 비슷하고(0이쫌더 빠르긴함) 확실히 1로 줬을때보단 빠르긴 한듯합니다. 용량 작으면 그냥 하고 용량 크면 데이터 유실될 가능성이 좀 더 적은 2로 주고 하는게 좋겠네요. 

 

 

2.innodb buffer pool size 

아마 이게 가장 대표적이고 또 확실히 눈에 보이게 성능 향상이 이루어질걸로 판단한다.

극단적으로 보기위해 기존에는 디폴트 값(128MB)과 서버 메모리(32GB)에 맞게끔 변경해서 비교했는데

7GB 짜리 덤프파일 복원 하는데 3시간 쫌 넘게 걸렸고
real    187m17.825s 
user    2m21.802s 
sys     0m6.869s

 

이번에는 innodb buffer pool size = 20GB로 변경하고 .sql 용량 =8GB 짜리 복원시(키 버퍼랑 등등 추가로 알맞게 진행)

real    40m44.386s
user    2m21.319s
sys     0m8.349s

역시... innodb buffer pool size 는 튜닝 필수다.

 

 

내용 요약.

1.innodb buffer pool size 수정은 필수(그에따른 키 버퍼나 솔트 버퍼등도 구글링해서 알맞게 수정)

2.용량이 큰 dump파일 복원시 innodb_flush_log_at_trx_commit 는 2로 변경
ㄴ실제 사용시 상황에 맞게(안전성이냐 속도냐) 1또는 2로 사용

'job > mysql' 카테고리의 다른 글

mysql log file size error  (0) 2019.06.26
mysql replication relay log relay-bin.999999 bug  (0) 2019.05.03
mysql 대용량 DB 백업 구성  (0) 2019.04.09
mysql dead lock 확인하기  (0) 2019.01.24
mysql innodb buffer pool size  (0) 2019.01.24

엔서블 특징

1.에이전트 설치 필요없음 - 이게 제일 장점인듯 호스트서버에만 엔서블 설치하면되니까
ㄴ다만 클라이언트에도 2.6 이상의 파이썬이 설치돼있어야한다. centos5 버전은 파이썬2.4 설치돼있어서 중복으로 설치해야함
2.yaml 로 저장돼있어서 많은 사람들(운영, 관리, 개발팀등)이 쉽게 알아볼 수 있음
3.대부분의 OS에 사용가능(윈도우도 가능하고 네트워크 장비들까지도 됨)
4.멱등성
5.모듈 많음
6.쉬움
7.오픈소스

 

 

엔서블 vi 탭을 띄어쓰기 2개로 변경하는법

- vi 에서 yaml 작성할때 탭으로 가능하도록 설정

$HOME/.vimrc 파일안에 아래 입력 .vimrc 파일 없으면 만들어주면 된다.
autocmd FileType yaml setlocal ai ts=2 sw=2 et

'job > ansible' 카테고리의 다른 글

ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-3 playbook  (0) 2019.04.25
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22
ansible 공부  (0) 2018.10.10

yum install -y nodejs 한 다음 yum install -y npm 하면 npm 패키지 설치하면서 기존에 설치된 nodejs 패키지랑 충돌나서 npm 설치가 안됨

 

  file /usr/lib/node_modules/npm/node_modules/ini from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/init-package-json from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/lockfile from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/npm-user-validate from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/once from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/opener from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/read from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/sha from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64

 

  file /usr/lib/node_modules/npm/node_modules/retry conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/rimraf conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/semver conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/sha conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/slide conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/tar conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/uid-number conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/which conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/package.json conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64

 

이런식으로 충돌납니다. 위와같이 충돌나면 rpm -qa | grep node 해서 나온거 삭제해주고

 

npm 패키지 안에 nodejs 도 들어있으니까 nodejs 설치할필요없이 npm만 yum으로 설치해주면 됨

 

 

그다음 npm install socket.io 하면 

npm http GET https://registry.npmjs.org/socket.io
npm http GET https://registry.npmjs.org/socket.io

npm ERR! Error: CERT_UNTRUSTED
npm ERR!     at SecurePair. (tls.js:1370:32)
npm ERR!     at SecurePair.EventEmitter.emit (events.js:92:17)
npm ERR!     at SecurePair.maybeInitFinished (tls.js:982:10)
npm ERR!     at CleartextStream.read [as _read] (tls.js:469:13)
npm ERR!     at CleartextStream.Readable.read (_stream_readable.js:320:10)ㄴ

 

이런식으로 에러 난다.

 

https 인증 어쩌구 저쩌구 하는데 

npm config set strict-ssl false

인증 우회 하고 다시 npm install socket.io 설치하면 

/usr/lib/node_modules/socket.io/usr/lib/node_modules/socket.io]# pwd 
/usr/lib/node_modules/
socket.io

 

 

/usr/lib/node_modules/socket.io]# ll
total 48
drwxr-xr-x 2 root root  4096 2019-04-10 09:50 lib
drwxr-xr-x 8 root root  4096 2019-04-10 09:50 node_modules
-rw-r--r-- 1 root root 18733 2019-04-10 09:50 package.json
-rw-r--r-- 1 root root 16588 1985-10-26 17:15 Readme.md

 

잘 설치됐다.

'job > linux' 카테고리의 다른 글

서버 점검..  (0) 2019.06.11
centos 5 yum error  (0) 2019.04.29
ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20

ionice란...

 

말그대로 io 우선순위 정하는거인데

 

나같은경우는 백업시 실 서비스에 영향을 주지 않게하기위해서 우선순위를 가장 마지막으로 하기 위해 ionice란 명령어를 사용한다.

 

보통 ionice -c2 -n 7 옵션으로 사용하는데

 

-n 옵션은 우선순위를 0~7 까지 지정한다. 7이 제일 꼴찌 0이 가장 우선


0 for none, 1 for realtime, 2 for best-effort, 3 for idle.

위와같이 설명 돼 있다.

 

 

0은 말그대로 none  스케쥴링을 없게끔 하는듯 하고...

1 rt(real time)는 우선순위를 지정할 순 있는데 rt가 best-effort보다 우선이다. 즉 best-effort 보다 rt가 우선순위가 더 빠르고 rt중에서도 우선순위를 정할 수 있다.

 

2 는 best-effort 로 
이것은 특정 io 우선 순위를 요구하지 않은 프로세스에 대한 효과적인 스케줄링 클래스다. 이 세분류는 0-7에서 우선 순위 논쟁을 하며, 낮은 숫자는 우선 순위가 더 높다. 동일한 최상의 작업 우선순위로 실행하는 프로그램은 라운드 로빈 방식으로 제공된다.
번역기 돌리면 위와같다. 

-n 옵션을 사용하기위해서는 -c2 로 설정해야하는듯 하다. 그래야 0~7까지 분류를 하니까

 

마지막으로 3은 idle 다른 작업이 없을때 실행한다는 뜻이다.

 

idle로 하면 아마도 디스크가 아무것도 사용이 안될때만 실행하는듯하고...

 

1(rt)은 우선순위를 높게 정할때 사용해야할듯, 너무 우선순위가 높아버리면 또 문제가 있으려나. 2(best effort)로 하고 우선순위를 0으로 정해주는게 좋을듯도 싶다.

 

나는 우선순위를 늦추는게 목적이니 2(best effort)로하고 우선순위도 7로 지정

'job > linux' 카테고리의 다른 글

centos 5 yum error  (0) 2019.04.29
nodejs npm , socket.io 설치  (0) 2019.04.10
strace debug  (0) 2019.02.21
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20
geoip iptables 설치  (2) 2019.02.15

master 서버 1대/ slave 서버 3대 리플리케이션 구성

CPU : E5-2620 v3 @ 2.40GHz, 24core / RAM : 96GB 4대 모두 동일사양 / 디비 용량 1.1TB / 테이블 약 220개, 그중 용량 큰 테이블은 약 40개정도(개당 10~40GB)

사양은 4대 모두 동일

 

 

관리 방법 정리
1.mysqldump
장점 : 간편하다.. 가장 기본적인 방법
(디비 용량이 작다면 심플하게 table 단위로 mysqldump 백업이 가장 좋다고 본다.)

단점 : 백업 시간이 오래걸리고 복원하는데도 오래걸린다. 

약 500GB 테이블단위로 백업하는데 약 2시간 30분 걸리고 377GB로 백업됨


1-1.mysqldump후 .sql 파일을 한번더 tar로 압축하여 보관

약 20GB 짜리 덤프파일 하나를 tar -cvzf 로 압축할경우 약 2.6GB로 압축됨, 압축하는데 걸리는 시간은 8분~8분30초

약 40GB 짜리 덤프파일 하나를 tar -cvzf 로 압축할경우 약 5.7GB로 압축됨, 압축하는데 걸리는 시간은 약 25분소요
ㄴ이 파일 압축 푸는데 걸리는 시간은 약 10분인데 400기가 데이터 날리면 약 100분동안 압축 푸는시간 날리는거

 

장점 : 용량을 많이 줄일 수 있으니까(상황에 따라 다르겠지만 실 데이터에 약 8분의1정도 압축됨) 그만큼 보관 주기도 길게 잡을 수 있다.

단점 : 백업하고 복원하는데 시간 더럽게 오래 걸린다.용량 큰 디비에 이거 하나만 가지고 운영하는건 거의 도라이짓임(누가 디비를 잘못 삭제해서 장애 한번나면... 복원하는데 시간 더럽게 오래걸림)

 

 

2.xtrabackup

장점 : 속도가 빠르다. 증분백업도 된다.
단점 : 용량이 크다. 추가로 설치해야한다.(ibdata나 디렉토리등 데이터를 복사하는 방식이라 실제 데이터와 용량이 거의 같다. 즉 1TB짜리 실 데이터 백업하려면 1TB가 필요, 증분 백업이 가능하기에 어느정도 커버 가능하다본다.)

 

 

xtrabackup

500GB 백업하는데 약 2시간 40분
덤브백업하는데 
real    165m33.431s
user    77m40.210s
sys     8m34.757s

 

netstat -nlp 하면 가끔가다가 멈췄다가? 지연된건가 ? 하여튼 동영상 보면 알겠찌만 저런 서버들이 간혹있다.


동영상 처음올려보는데 뭔가 되게 더럽다 이상하게. 하여튼 보면 알겠지만
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2983/sshd           

여기서 한번

tcp        0      0 :::22                       :::*                        LISTEN      2983/sshd           

여기서 한번 멈춘다.


이 다음껄 불러오는데 느려지는건가 아니면 저 ssh 를 불러오고난뒤?(혹은 불러오는과정이라 봐도 되나 ?)에서 느려지는건지 알아볼꺼다. strace를 이용해서 한번 찾아보자.


strace란     ##https://brunch.co.kr/@alden/12

시스템콜 시그널등을 추적하는 디버깅 툴

시스템콜이란    ##https://luckyyowu.tistory.com/133

커널단의기능을 사용자(os)가 사용할 수있게 해준다.


시그널이란   ##http://blog.naver.com/PostView.nhn?blogId=guy2648&logNo=10103891030

프로세스 구동중 예외상황(ex 컨트롤 씨로 멈춘다던가)에 발생하는 신호


주요 옵션이나 사용법등은 저기 위에 브런치 사이트에 다 있으니까 생략

-c 옵션 줘서 내용 보면

% time     seconds  usecs/call     calls    errors syscall

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

 99.97    8.969419        2159      4154       377 read


리드하면서 시간도 오래걸리고 에러도 난다.



우선 netestat 명령어에 사용되는 C 함수들이 뭐뭐 있는지

~]# cat strace_netstat2  | awk '{print $3}' | awk -F "(" '{print $1}' | sort | uniq -c | sort -n

      1 +++

      1 access 파일 존재나 접근 권한을 확인

      1 arch_prctl

      1 execve 다른프로그램을 실행

      1 exit_group 프로세스 내의 모든 스레드 끝내기

      1 fcntl 파일을 전체나 파일의 일부를 다른 프로세스에서 사용하는 것을 제한

      1 statfs 파일시스템 정보 

      3 brk 데이터 세그먼트의 영역을 넓혀준다.

      7 mprotect 주어진 메모리 영역의 권한을 변경

      9 munmap 메모리 맵핑 제거

     13 fstat 열린 파일의 상태 및 정보 보기

     15 write 말그대로 write

     21 mmap 메모리매핑

   1082 close 말그대로 닫기

   1089 open 말그대로 열기

   1114 getdents 디렉토리 엔트리 불러오기

   1353 readlink 심볼릭링크된 파일을 읽기

   4308 read 일기



strace -s 65535 -f -t -o strace_netstat nestat -nlp



7127 12443 15:30:58 open("/proc/net/x25", O_RDONLY) = -1 ENOENT (No such file or directory)

7128 12443 15:30:58 open("/proc/net/nr", O_RDONLY) = -1 ENOENT (No such file or directory)

7129 12443 15:30:58 exit_group(0)            = ?

7130 12443 15:30:58 +++ exited with 0 +++


겁내 길다 하지만 진득하게 해보자


첫줄부터


   1 12443 15:30:53 execve("/bin/netstat", ["netstat", "-nlp"], [/* 23 vars */]) = 0

   2 12443 15:30:53 brk(0)                   = 0x1994000

   3 12443 15:30:53 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc359886000

   4 12443 15:30:53 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

   5 12443 15:30:53 open("/etc/ld.so.cache", O_RDONLY) = 3

   6 12443 15:30:53 fstat(3, {st_mode=S_IFREG|0644, st_size=30677, ...}) = 0


맨앞에필드는 12443는 PID다. netstat -nlp 입력했을 때의 PID 

[root@test ~]# ps -ef | grep netstat

root      9157 12279 23 14:30 pts/4    00:00:00 strace -s 65535 -f -t -o strace_netstat2 netstat -nlp

root      12443  9157  8 14:30 pts/4    00:00:00 netstat -nlp


세번째부터가 이제 어떤 시스템콜(C 함수들)이 이용됐는지가 나온다. execve brk mmap access open fstat 등등 각 함수들마다 구글링해보면 다 뭐 나온다. 뭐 변수가 어쩌고 확장이 어쩌고 저쩌고 ... 하여튼

execve 함수는 다른 프로그램을 실행하고 자신은 종료한댄다. 즉 netstat 명령어를 실행하면 execve 함수로 netstat를 실행하는듯~?

brk는 데이터 세그먼트의 영역을 넓혀준다.  라고 한다.


뭐 netstat 가 어떤식으로 구동되는지까지 알필요는 없으니까... 느려지는 부분부터 한번 봐보자.


우선 netstat에 필요한 라이브러리들

~]# ldd /bin/netstat

        linux-vdso.so.1 =>  (0x00007ffc5d6f0000)

        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4021263000)

        libc.so.6 => /lib64/libc.so.6 (0x00007f4020ecf000)

        libdl.so.2 => /lib64/libdl.so.2 (0x00007f4020cca000)

        /lib64/ld-linux-x86-64.so.2 (0x0000562a176ac000)


   1 21682 14:52:28 execve("/bin/netstat", ["netstat", "-nlp"], [/* 24 vars */]) = 0

   2 21682 14:52:28 brk(0)                   = 0x1914000

   3 21682 14:52:28 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc716503000

   4 21682 14:52:28 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

   5 21682 14:52:28 open("/etc/ld.so.cache", O_RDONLY) = 3

   6 21682 14:52:28 fstat(3, {st_mode=S_IFREG|0644, st_size=30677, ...}) = 0

   7 21682 14:52:28 mmap(NULL, 30677, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc7164fb000

   8 21682 14:52:28 close(3)                 = 0

   9 21682 14:52:28 open("/lib64/libselinux.so.1", O_RDONLY) = 3


ldd로 나온 라이브러리들 순서대로 불러온다. libselinux.so.1 부터 llibdl.so.2 


근데 보는것처럼 linux-vdso.so.1 이건 없다. 아마 4번째 라인에 노써치파일이 아마 이게 아닐까 ?

그리고 /lib64/ld-linux-x86-64.so.2 이것도 없다.  근데 이건 no such file  에러도 없다.  아유 어쨋든..


대충 1~50라인까지는 라이브러리 불러오는거고 60라인쯤부터 1800 라인까지는 centos 구동시 기본으로 실행되는 데몬들 open 한다.

root      1986     2  0  2018 ?        00:01:26 [edac-poller]

root      2156     2  0  2018 ?        00:00:00 [kipmi0]

root      2684     2  0  2018 ?        00:00:00 [jbd2/sda1-8]

root      2685     2  0  2018 ?        00:00:00 [ext4-dio-unwrit]

root      2717     2  0  2018 ?        00:00:00 [kauditd]

root      2893  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2894  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2898     2  0  2018 ?        00:10:10 [flush-8:0]

root      2963     1  0  2018 ?        00:01:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

root      2983     1  0  2018 ?        00:00:25 /usr/sbin/sshd

root      2997     1  0  2018 ?        00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

root      3009     1  0  2018 ?        00:01:46 crond

nobody    3278     1  0  2018 ?        00:03:04 /usr/local/checker/sbin/thttpd -C /usr/local/checker/etc/thttpd.conf

root      3561     1  0  2018 ?        00:34:50 /opt/apache/bin/httpd -k start

root      4103     1  0  2018 tty1     00:00:00 /sbin/mingetty /dev/tty1

root      4105     1  0  2018 tty2     00:00:00 /sbin/mingetty /dev/tty2

root      4107     1  0  2018 tty3     00:00:00 /sbin/mingetty /dev/tty3

root      4109     1  0  2018 tty4     00:00:00 /sbin/mingetty /dev/tty4

root      4111     1  0  2018 tty5     00:00:00 /sbin/mingetty /dev/tty5

root      4113     1  0  2018 tty6     00:00:00 /sbin/mingetty /dev/tty6

daemon   11230  3561 36 15:29 ?        00:02:33 /opt/apache/bin/httpd -k start

root     11938     1  0 15:30 ?        00:00:00 /usr/bin/python -Es /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b

daemon   12878  3561 36 15:31 ?        00:01:42 /opt/apache/bin/httpd -k start

daemon   12900  3561 35 15:31 ?        00:01:37 /opt/apache/bin/httpd -k start

daemon   12902  3561 36 15:31 ?        00:01:42 /opt/apache/bin/httpd -k start

daemon   13409  3561 36 15:32 ?        00:01:24 /opt/apache/bin/httpd -k start

daemon   13411  3561 37 15:32 ?        00:01:26 /opt/apache/bin/httpd -k start


위와같이 실행돼있는 프로세스들중

root      2894  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2898     2  0  2018 ?        00:10:10 [flush-8:0]

root      2963     1  0  2018 ?        00:01:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

root      2983     1  0  2018 ?        00:00:25 /usr/sbin/sshd

여기까지가 아마 os 구동시 기본으로 구동되는 데몬이라고 생각할 수 있을것같다.


strace 파일 보면

1992 12443 15:30:53 open("/proc/2983/attr/current", O_RDONLY) = 5

1993 12443 15:30:53 read(5, 0x19a53e0, 4095) = -1 EINVAL (Invalid argument)

1994 12443 15:30:53 close(5)                 = 0

1995 12443 15:30:53 readlink("/proc/2983/fd/4", "socket:[12960]", 29) = 14

1996 12443 15:30:53 open("/proc/2983/attr/current", O_RDONLY) = 5

1997 12443 15:30:53 read(5, 0x19a5440, 4095) = -1 EINVAL (Invalid argument)

1998 12443 15:30:53 close(5)                 = 0

1999 12443 15:30:53 getdents(4, /* 0 entries */, 32768) = 0

2000 12443 15:30:53 close(4)                 = 0

2001 12443 15:30:53 open("/proc/2997/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4

2002 12443 15:30:53 getdents(4, /* 3 entries */, 32768) = 72

2003 12443 15:30:53 readlink("/proc/2997/fd/3", "socket:[12989]", 29) = 14

2004 12443 15:30:53 open("/proc/2997/cmdline", O_RDONLY) = 5

2005 12443 15:30:53 read(5, "/usr/sbin/vsftpd\0/etc/vsftpd/vsftpd.conf\0", 511) = 41

2006 12443 15:30:53 close(5)                 = 0

2007 12443 15:30:53 open("/proc/2997/attr/current", O_RDONLY) = 5

이제 대충 어떤느낌인지 알겠다. 

netstat -nlp 하면 모든 프로세스들 불러오고 그중에 데몬 리스트를 pid랑 port랑 이런식으로 출력해주는거니까


1.netstat -nlp 입력시 netstat에 사용되는 라이브러리를 open mmap read close등을 진행 - 50라인쯤

2.OS에 올라와있는 모든 프로세스를 pid순으로 open/작업(getdents,read,readlink등)/close 진행 - 5400라인쯤

ㄴnetstat -nlp는 정보를 보는거니까 당연히 위와같은 디렉토리엔트리를 불러오거나 뭘 읽거나 하겠죠?

3.5400라인쯤부터 이제 netstat -nlp했을 때 나오는 문장들을 write 함수로 쓴다.

정확히는 12443 15:30:56 open("/proc/net/tcp6", O_RDONLY) = 3 이런식으로 /proc/net/tcp6 을 불러와서

12443 15:30:56 read(3, "  sl  local_address                         remote_address                        st tx_queue

위와같이 읽은다음 

12443 15:30:56 write(1, "tcp        0      0 :::5000                     :::*                        LISTEN      3278/thttpd         \n", 109) = 109

이렇게 실제로 write를 한다.



##########

여담

5392 12443 15:30:54 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3

5393 12443 15:30:54 fstat(3, {st_mode=S_IFREG|0644, st_size=2512, ...}) = 0

5394 12443 15:30:54 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc359885000

5395 12443 15:30:54 read(3 어쩌구 저쩌구 /usr/share/locale/locale.alias 내용 나옴)

netstat -nlp 했는데 위 파일을 왜 열지 ? 궁금해서 이 파일 삭제하고서 netstat -nlp 실행해봤다.

1044 29673 16:02:34 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

1045 29673 16:02:34 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

1046 29673 16:02:34 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

1047 29673 16:02:34 open("/usr/share/locale/en_US/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

그냥 에러나고 끝이다. 실행도 잘된다. 근데 내가 에러를 못찾은거일수도있다. 하고자 하는 말이뭐냐면... 그냥 뭐랄까 별에 별파일을 다 쓰는구나. 함부로 지우지말자.

#######

4.그리고 exit_group 끝





자 이글의 목적인 netstat -nlp 시 왜 특정구간(sshd 데몬쪽)에서 느려지는건지 이제 이유가 보인다.


6270 12443 15:30:56 write(1, "tcp        0      0 :::5000                     :::*                        LISTEN      3278/thttpd         \n", 109) = 109

6271 12443 15:30:56 write(1, "tcp        0      0 :::81                       :::*                        LISTEN      3561/httpd          \n", 109) = 109

6272 12443 15:30:56 write(1, "tcp        0      0 :::22                       :::*                        LISTEN      2983/sshd           \n", 109) = 109

6273 12443 15:30:56 read(3, "00000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:B4EE 06 00000000:00000000 03:00000000 00000000     0        0 0 3 ffff880c74c5a940\n   6: 0000000000000000FFFF00

     006F7926DA:0051 0000000000000000FFFF00006F7926DA:CFA8 06 00000000:00000000 03:0000115F 00000000     0        0 0 3 ffff880939ba0580\n   7: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F79

     26DA:D73A 06 00000000:00000000 03:000016E8 00000000     0        0 0 3 ffff880814409840\n   8: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:A626 06 00000000:00000000 03:00000000 0

     0000000     0        0 0 3 ffff880c76532440\n   9: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:A708 06 00000000:00000000 03:00000000 00000000     0        0 0 3 ffff88086fff6200\

     n  10: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:D7A6 06 00000000:00000000 03:00001730 00000000     0        0 0 3 ffff880927c64200\n  11: 0000000000000000FFFF00006F7926DA:0051

      0000000000000000FFFF00006F79", 1024) = 1024




이런식으로 6273 같은 라인이 진짜 어~~~마무시하게 read가 많이 이루어진다.

거의 800라인 가까이 위와같은 read작업이 이루어진다. 다른 정상인 서버들은 저러지 않는다. 저 read작업이 뭔지 알면되겠다.


5418 12443 15:30:54 read(3, "                         \n   6: 6F7926DA:C56A 6F7926DA:0051 06 00000000:00000000 03:00000B1B 00000000     0        0 0 3 

ffff8808728b24c0                                      \n   7: 6F7926DA:0050 9158E6C0:A773 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff88086f41e280                                      \n   8: 6F7926DA:0050 2158E6C0:     E732 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff880871e65dc0                                      \n   9: 6F7926DA:D3A8 6F7926DA:0051 06 00000000:00000000 03:00001533 00000000     0        0 0 3 

ffff880c77a5bdc0                                      \n  10: 6F7926DA:C4D6 6F7926DA:0051 06 00000000:00000000 03:00000AB8 00000000     0        0 0 3 

ffff880c751e3cc0                                      \n  11: 6F7926DA:0050 0158E6C0:92FB 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff88087048b580                                      \n  12: 6F7926DA:CF10 6F7926DA:0051 06 00000000:00000000 03:00001205 00000000     0        0 0 3 fff", 1024) = 1024


netstat -nlp 했을 때/proc/net/tcp /proc/net/tcp6 두 파일을 베이스로 netstat는 출력하는 명령어다. (자세한건 https://www.joinc.co.kr/w/Site/system_programing/proc/NetState)

/proc/net/tcp 는 tcp 정보를 아스키형태로 저장된 파일임

netstat -nlp 했을 때 출력되는건 TIME_WAIT이 배제된채로 출력되지만 실제로는 /proc/net/tcp 이거를 전부 read 하게 된다.  /proc/net/tcp여기에는 TIME_WAIT 관련 정보까지 전부 저장되기 때문에 TIME_WAIT이 많은 서버들에서 대체로 netstat -nlp 가 오래걸린다.


처음에는 sshd 명령어 이후에 딜레이 되니까 ssh쪽이 뭐 문제인가 아니면 thttpd를 불러오는데 뭐가 문제인가 싶었는데 완전 틀렸다.









'job > linux' 카테고리의 다른 글

nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20
geoip iptables 설치  (2) 2019.02.15
rsync를 통한 파일 전송시 속도 테스트  (0) 2018.12.06

php-fpm 메모리 누수, 사용률 확인하기


현재상황
서버 메모리 16GB

php memory limit 기본 설정(128MB)
ㄴ)메모리 리밋은 말그대로 php에서 어떤 작업을 할 때 사용할 수 있는 최대 메모리양이다. 

(예를들어 php를 통해 파일을 업로드할경우 메모리에 먼저 적재가 되기 때문에 memory_limit 값보다 높은파일은 업로드가 안됨)

pm.max_children = 50
ㄴphp-fpm의 자식프로세스 최대 갯수

pm.start_servers = 5

ㄴphp-fpm 실행하면 처음부터 실행돼잇는 자식 프로세스 갯수

pm.min_spare_servers = 5

pm.max_spare_servers = 35

ㄴmin/max값을 벗어나면 서버에서 최대한 저 값을 맞추려고 노력함


엔진엑스-php-fpm 사용중

 ~]# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      6374/php-fpm: pool  

tcp        0      0 0.0.0.0:2221            0.0.0.0:*               LISTEN      3162/sshd           

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7420/nginx: master  



~]# sar -r | awk '{print $1"  "$5}'

12:00:01  %memused

12:10:02  48.52

12:20:01  49.46

12:30:01  50.59

12:40:01  51.56

12:50:01  52.74

중략

03:00:01  61.27

03:10:01  61.64

03:20:01  62.09

03:30:01  62.62

03:40:02  62.73

03:50:01  63.13

04:00:01  63.26

04:10:01  63.74

중략

09:10:01  78.38

09:20:01  78.95

09:30:01  79.87

09:40:01  80.27

09:50:01  81.05


[root@ ~]# ps -ef | grep php-fpm | wc -l

37


[root@ ~]# ps -aux | grep php-fpm | awk '{print $1"  " $6/1024" MB"}'

php-fpm  342.27 MB

php-fpm  340.383 MB

php-fpm  302.711 MB

php-fpm  284.441 MB

php-fpm  227.84 MB

php-fpm  227.137 MB

root  30.1016 MB

php-fpm  561.434 MB

php-fpm  562.66 MB

php-fpm  561.309 MB

php-fpm  561.824 MB

php-fpm  561.129 MB

php-fpm  561.129 MB

php-fpm  561.176 MB

php-fpm  562.145 MB

php-fpm  561.16 MB

php-fpm  558.332 MB

php-fpm  221.172 MB

php-fpm  213.012 MB

php-fpm  213.227 MB

php-fpm  212.008 MB

php-fpm  212.664 MB

php-fpm  212.996 MB

php-fpm  213.375 MB

php-fpm  207.363 MB

php-fpm  511.531 MB

php-fpm  509.504 MB

php-fpm  509.344 MB

root  0.953125 MB

php-fpm  182.289 MB

php-fpm  181.621 MB

php-fpm  181.457 MB

php-fpm  176.219 MB

php-fpm  175.359 MB

php-fpm  174.516 MB

php-fpm  172.77 MB

php-fpm  169.117 MB


]# php test.php

echo memory_get_usage(); 349976

echo memory_get_peak_usage(); 384968





현재상황은 위와같이

1.시간이 지날수록 메모리 점유율이 올라간다. 그러다 마지막에는 oom 발생
2.php-fpm 에서의 메모리 사용률이 너무 높다. 처음에는 100MB에서 200MB 300MB 지금처럼 500MB이상까지도 차다가 마지막에 oom 발생
3.php-fpm 자식프로세스의 갯수는 37개로 pm.max_children 수치에는 못미친다. 따라서 해당 설정의 수치를 변경한다해서 해결이되지 않는다. 

4.php 에서 사용한 최대 메모리가 1메가도 안된다. 

ㄴmemory_get_peak_usage(); 384968 바이트 단위임, 메가로 환산하면 0.4메가도 안됨


궁금한점

Q)1.php.ini 의 memory_limit 이랑 php-fpm.conf 의 memory_limit 설정은 같은거고 우선순위가 있는건가 ?? 아니면 다른개념인가 ?

A)같은개념이고 우선순위는 php-fpm.conf가 먼저.. 서버 / htaccess / 소스 순인것처럼 

해당 서버의 php에서 사용된 최대 메모리는 1메가도 안되니까 memory_limit은 튜닝할필요가 없는거고. 또 추가로 자잘자잘한 엄청 수많은 작업이 종료되지않고 계속 사용하고 있따고 봐야할듯


2.php-fpm의 자식프로세스가 사용하는 memory limit은 설정이 없나 ? 


3.php-fpm의 자식프로세스들은 어떡하다가 500MB 이상씩의 메모리를 사용하게 됐지 ? 이걸 확인하는 방법은 ?(누수인지 아닌지 확인하고싶다.)

ㄴphp-fpm 자식프로세스들의 PID를 엔진엑스 어세스 로그에 남겨보는방법 ?

ㄴ아니면 php-fpm status 볼 수 있는 툴이 있나 ?






이제부터 지금 상황이 정말 메모리 누수가 맞는지. 맞다면 왜 누수가 일어나는지 알아보자.

1.netstat -an | grep -v TIME_WAIT 했을 때 수상한거 없이 소켓잘 닫히고 있음.

2.keep alive 65로 설정돼있음



으악 생각보다 너무 쉽게 원인을 찾은것같다.
https://xetown.com/tips/1171902

php-fpm 자체가 기본설정시 메모리 사용 누적이랜다...;; 

나는 소스단에서 뭔가 잘못짜여져 있어서 메모리 누수가 있는줄알았는데.. 


일단 php-fpm 아무설정도 안하면 pm.max_requests 값은 무한대라서 메모리 누수가 계속 쌓이다. 따라서 pm.max_requests 500 으로 설정해주고 한번 지켜보자.


'job > linux' 카테고리의 다른 글

ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21
geoip iptables 설치  (2) 2019.02.15
rsync를 통한 파일 전송시 속도 테스트  (0) 2018.12.06
hpssacli 설치했는데 잘 안됨  (1) 2018.12.05

기존에 geoip iptables 설치하려면



./geoip/xt_geoip_dl"


./geoip/xt_geoip_build GeoIPCountryWhois.csv"


이부분 진행했었는데 이중에서 ./geoip/xt_geoip_dl" 요거 이제 에러난다.


~/geoip/xtables-addons-1.47.1/geoip]# ./xt_geoip_dl  

--2019-02-15 10:45:49--  http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

Resolving geolite.maxmind.com... 104.16.37.47, 104.16.38.47, 2606:4700::6810:262f, ...

Connecting to geolite.maxmind.com|104.16.37.47|:80... connected.

HTTP request sent, awaiting response... 404 Not Found

2019-02-15 10:45:50 ERROR 404: Not Found.


--2019-02-15 10:45:50--  http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

Connecting to geolite.maxmind.com|104.16.37.47|:80... connected.

HTTP request sent, awaiting response... 404 Not Found

2019-02-15 10:45:50 ERROR 404: Not Found.


gzip: GeoIPv6.csv.gz: No such file or directory

unzip:  cannot find or open GeoIPCountryCSV.zip, GeoIPCountryCSV.zip.zip or GeoIPCountryCSV.zip.ZIP.




http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip


위 두 파일이 없다고 한다. 실제로 홈페이지 들어가보면 not found 뜬다. 파일이 없다.

http://geolite.maxmind.com/download/geoip/database/ 여기까지만 들어가보면 홈페이지가 바꼈다.

https://dev.maxmind.com/geoip/geoip2/geolite2/ 여기로 들어가진다.


geolite2가 나오면서 저 파일들도 없어지고 뭐 이것저것 한것같다.


그럼 어떡해야할까 우리는 설치하고싶은데 


http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

위 두파일이 뭐로 대체됐는지 찾으면 되겠찌 ?

사실 가장 정확한 방법은 새로 변경된 geolite2 를 이용해 iptables에 적용을 해야하는데... 모르겠다. 어렵다


하여튼 다운로드 경로 들어가보면 아래 파일들이 보인다.


GeoLite2 City

GeoLite2 Country

GeoLite2 ASN (Autonomous System Number)


이중에서 시티는 말그대로 도시일꺼고 컨츄리는 나라일꺼고 ASN은 들어가보니까 sk 브로드밴드도 있고 kt도 있고한거보니까 통신사 넘버인듯


하여튼 GeoLite2 Country 이거 csv로 다운받는다.


-rw-r--r-- 1 root root 11734000 2019-02-13 07:08 GeoLite2-Country-Blocks-IPv4.csv

-rw-r--r-- 1 root root  3464092 2019-02-13 07:08 GeoLite2-Country-Blocks-IPv6.csv

-rw-r--r-- 1 root root     9864 2019-02-13 07:08 GeoLite2-Country-Locations-de.csv

-rw-r--r-- 1 root root     9937 2019-02-13 07:08 GeoLite2-Country-Locations-en.csv

-rw-r--r-- 1 root root     9992 2019-02-13 07:08 GeoLite2-Country-Locations-es.csv

-rw-r--r-- 1 root root    10230 2019-02-13 07:08 GeoLite2-Country-Locations-fr.csv

-rw-r--r-- 1 root root    14998 2019-02-13 07:08 GeoLite2-Country-Locations-ja.csv

-rw-r--r-- 1 root root    11422 2019-02-13 07:08 GeoLite2-Country-Locations-pt-BR.csv

-rw-r--r-- 1 root root    14932 2019-02-13 07:08 GeoLite2-Country-Locations-ru.csv

-rw-r--r-- 1 root root    11732 2019-02-13 07:08 GeoLite2-Country-Locations-zh-CN.csv


압축 풀어보면 이런식으로 나온다........... 안에 들어가보면 csv 양식이 바꼈따 ...... 흠


https://github.com/mschmitt/GeoLite2xtables

여기에 geolite2 를 기존 geolite .csv 로 컨버팅하는 스크립트가 있다. 요걸로 하면 잘된다 ㅋㅋ


하는방법은 아래와같다.

xt_geoip_dl 파일안의 내용을 
#########

#!/bin/bash


rm -rf GeoLite2-Country-CSV*


wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip

unzip -o -j GeoLite2-Country-CSV.zip '*/GeoLite2-Country-Blocks*'


wget http://download.geonames.org/export/dump/countryInfo.txt


cat GeoLite2-Country-Blocks-IPv{4,6}.csv | ./20_convert_geolite2 CountryInfo.txt > GeoIPCountry.csv

######

20_convert_geolite2 요것만 다운받아주고

ㄴperl 모듈 설치하라고 나오면 cpan -i NetAddr::IP 이거 하면된다.

위와같이 바꿔준다. 그리고 실행하면 된다.

나머지부터는 

check_function "./geoip/xt_geoip_build GeoIPCountry.csv"



mkdir -p /usr/share/xt_geoip

cp -r {BE,LE} /usr/share/xt_geoip/


이거 동일하게 하면됨


ps1.

"perl-Text-CSV_XS"는 쉼표(,)로 이루어진 값들을 구성하고, 분해하는 역할을 하는 패키지입니다. 엑셀 비슷하다고 보시면 됩니다.

"xtables-addons"는 커널/IPTables에서 제공하지 않는 기능을 추가적으로 지원해주는 Addons<확장팩(?) 비슷한 개념>입니다.


출처: https://sata.kr/entry/IPTables-12-IPTables에-GeoIP를-설치해보자-GeoIP-CentOS-6CentOS-7 [SATAz BLOG]

>> Real Server Group 1# cur

Current real server group 1:

  name , metric hash, backup none, realthr 0, ipver v4

  rmetric roundrobin, health tcp, content 

  DSR VIP health: enabled

  Workload Manager: none

  IDS Group: disabled  IDS rport: any   IDS flood: disabled

  Operation: enabled

  adv health: 

  real servers:

     1: 192.168.0.11, enabled, name , weight 1, timeout 10 mins, maxcon 200000

       group ena, backup none, inter 2, retry 4, restr 2

       remote disabled, proxy enabled, submac disabled

       fasthc enabled, subdmac enabled

       cookie assignment server: disabled

       exclusionary string matching: disabled

     2: 192.168.0.12, enabled, name , weight 1, timeout 10 mins, maxcon 200000

       group ena, backup none, inter 2, retry 4, restr 2

       remote disabled, proxy enabled, submac disabled

       fasthc enabled, subdmac enabled

       cookie assignment server: disabled

       exclusionary string matching: disabled

     3: 192.168.0.13, enabled, name , weight 1, timeout 10 mins, maxcon 200000

       group ena, backup none, inter 2, retry 4, restr 2

       remote disabled, proxy enabled, submac disabled

       fasthc enabled, subdmac enabled

       cookie assignment server: disabled

       exclusionary string matching: disabled

  real ports:

    4306: vport 4306, rtspslb none

      virtual server:  1, IP4 192.168.0.10,    enabled


L4 알테온 스위치에서 설정하면 메트릭은 뭔지 알겄는데 r메트릭은 뭐지 ?


metric은 뭐 말그대로 부하분산 방식 설정하는건데 구글링하면 겁내 많이 나온다.

근데 rmetric은 도대체 멀까 ? 


일단

     metric   - Set metric used to select next server in group

     rmetric  - Set metric used to select next rport in server(서버에서 다음 rport를 선택하는데 사용되는 메트릭을 설정)
라는데... 음 그렇군요


MariaDB [(none)]> SHOW ENGINE INNODB STATUS\G


latest detected deadlock 항목에서 데드락을 확인할 수 있다.

마지막에 발생한 deadlock만 확인된다. 

내용을 보면


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

LATEST DETECTED DEADLOCK

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

2019-01-24 04:00:03 7f2914242b00 ## 데드락 발생시간

*** (1) TRANSACTION:  ##첫번째 트랜잭션

TRANSACTION 47312201250, ACTIVE 0 sec fetching rows

mysql tables in use 3, locked 3

LOCK WAIT 266 lock struct(s), heap size 30248, 2129 row lock(s)

MySQL thread id 13168615, OS thread handle 0x7f28fac80b00, query id 120397240 192.168.0.213 root updating

UPDATE `TABLE` SET `rsInstall` = '123123', `rsOpen` = '123123'   ##쿼리내용

WHERE `rsToday` = '123123'

AND `rsAdmIdx` = '123123'

AND `rsAffIdx` = '3123123'

AND `rsAdsIdx` = '123123'

AND `rsSubAffIdx` = '1123123'

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 9873 page no 170251 n bits 88 index `PRIMARY` of table `DB`.`TABLE` trx table locks 1 total table locks 2  trx id 47312201250 lock_mode X locks rec but not gap waiting lock hold time 0 wait time before grant 0     ##이부분이 지금 데드락에 빠진거고

*** (2) TRANSACTION:   ##두번째 트랜잭션

TRANSACTION 47312201244, ACTIVE 0 sec fetching rows

mysql tables in use 3, locked 3

241 lock struct(s), heap size 30248, 5827 row lock(s), undo log entries 22

MySQL thread id 13168659, OS thread handle 0x7f2914242b00, query id 120397235 192.168.0.213 root updating

UPDATE `TABLE` SET `rInstall` = '18123123, `rOpen` = '123123'   ##쿼리내용

WHERE `rsToday` = '123123'

AND `rsAdmIdx` = '123123'

AND `rsAffIdx` = '123123'

AND `rsAdsIdx` = '123213'

AND `rsSubAffIdx` = '123123'

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 9873 page no 170251 n bits 88 index `PRIMARY` of table `DB`.`TABLE` trx table locks 1 total table locks 2  trx id 47312201244 lock_mode X locks rec but not gap lock hold time 0 wait time before grant 0    ##여기도 데드락에 빠졌꼬 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 9873 page no 170473 n bits 88 index `PRIMARY` of table `DB`.`TABLE` trx table locks 1 total table locks 2  trx id 47312201244 lock_mode X locks rec but not gap waiting lock hold time 0 wait time before grant 0    ##데드락을 해결하기위해 이부분이 롤백됨

*** WE ROLL BACK TRANSACTION (2)   


위 두개의 트랜잭션이 데드락에 빠졌꼬 이를 해결하기 위해 두번째 트랜잭션이 롤백됐음 을 확인할 수 있다.


음. 난 dba가 아니라서 이걸보고 그다음 뭘 어떠케 해줘야 하는지 모르겠네 그래도 일단 dba한테 알려는 줄 수 있는 se가 되자 

상황


버전 : mysql  Ver 15.1 Distrib 10.1.29-MariaDB, for Linux (x86_64) using readline 5.1



메모리 용량 : ~]# free

             total       used       free     shared    buffers     cached

Mem:      65856248   65592836     263412          4      92876     181636

-/+ buffers/cache:   65318324     537924

Swap:      8389624    6001720    2387904






위와같이 물리 메모리 전부 사용하고 스왑메모리까지 사용하고 있다.



우선 innodb buffer pool size 란 간단하게 innodb용 캐시 사이즈라고 생각하면 될듯하다.



###innodb_buffer_pool_instances 이거는 buffer pool size 를 몇개의 쓰레드로 나눌지. buffer pool size 가 1GB 이상일때만 사용가능


내용 요약하자면
1.설정 안할경우 기본값은 128MB
2.최대값은 32bit의 경우 4GB(그러나 실제로는 더 낮을 수 있다고 한다.), 64bit의 경우 16엑사?바이트(첨봄, 테라>페타>엑사)
3.DB서버로만 이용할경우 물리 메모리의 80%를 권장한다.
4.할당값보다 10% 추가로 할당됨(디스크 파티션 나눌 때 10%정도 빠지는거랑 같은거)

공식홈페이지에 보면 innodb buffer 에대한 여러가지 기능(더블라이트나 뭐 하이튼 겁내 별게 많음)들을 사용하면 성능향상에 도움이 될 꺼같은데 언제 써야 도움이 되는지를 모르겠네...

하여튼 버퍼가 뭔지 알았으니까 이제 버퍼 사이즈를 조정할껀데.. 조정하는 이유를 먼저 알아야한다.(조정할 필요가 없는데 조정하면 안되니까)

조정하는이유는 메모리가 가득차서 스왑메모리영역까지 사용해버린다. 스왑사용하면 속도가 느려지니까 스왑사용안되도록 조치를 해야한다.(정상적으로 메모리가 사용이 되는거라 메모리부족한거면 메모리를 늘려야한다.) 보니까 버퍼 풀 사이즈가 큰거같다. 54GB로 잡혀있다. 이걸 줄여도 될까 자세히 한번 알아봐야겠따.

MariaDB [(none)]> SHOW ENGINE INNODB STATUS\G

SHOW ENGINE INNODB STATUS\G 명령어로 엔진의 상태를 좀 봐봐야겠다.
(
innodb의 상태를 저장해주는 innodb 모니터링이라는게 있는데 이걸 불러오는 명령어가 show engine innodb status 이다.즉 innodb 상태 보는 명령어. 내가 지금 봐야하는 buffer pool memory 섹션외에도 디텍티드 데드락섹션, 트랜잭션 세션이나 세마포어 섹션을 확인하여 데드락의 원인을 파악할 수 있다. 이거 다하고 공부해야지)

나는 buffer pool and memory 섹션을 봐야한다.

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

BUFFER POOL AND MEMORY

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

Total memory allocated 60728279040; in additional pool allocated 0    ### 약 56GB 정도 할당된걸 확인할 수 있음

Total memory allocated by read views 4192

Internal hash tables (constant factor + variable factor)

    Adaptive hash index 1547957664      (917988664 + 629969000)

    Page hash           7172584 (buffer pool 0 only)

    Dictionary cache    231761997       (229498768 + 2263229)

    File system         1032976         (812272 + 220704)

    Lock system         143445008       (143436728 + 8280)

    Recovery system     0       (0 + 0)

Dictionary memory allocated 2263229    ###딕셔너리에 할당된 메모리

Buffer pool size        3538936

Buffer pool size, bytes 57981927424

Free buffers            8189     
##
나는 지금 요부분이 중요하다.
서버의 메모리가 부족하여 스왑메모리가 사용됐고 이걸 방지하기위해 불필요하게 사용되는 메모리는 없는지 찾고있는 상황이였고 디비의 innodb buffer poolsize가 전체 메모리의 약 85~90프로를 차지하고 있다. 따라서 innodb buffer pool size 를 줄여야 하는데.. 줄여도 되는 상황일까 ? 
free buffers 가 8189 이다. 


Database pages          3492297

Old database pages      1288984

Modified db pages       141927

Percent of dirty pages(LRU & free pages): 4.054

Max dirty pages percent: 75.000

Pending reads 0

Pending writes: LRU 0, flush list 117, single page 0

Pages made young 1465646, not young 3638134

6.33 youngs/s, 1.00 non-youngs/s

Pages read 3411009, created 1266390, written 13049586

0.67 reads/s, 19.33 creates/s, 228.46 writes/s

Buffer pool hit rate 999 / 1000, young-making rate 0 / 1000 not 0 / 1000

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s

LRU len: 3492297, unzip_LRU len: 0

I/O sum[100408]:cur[2856], unzip sum[0]:cur[0]



결론

free buffer가 없으니 그냥 냅뒀따가 메모리 추가해야겠다. 
buffer pool size 의 쓰레드를 8개로 나눠서 사용하고 있는데 이거를 좀 더 잘게 나눠보고싶다. 근데 실 사용 서버이고 내가 갑이 아니라서 괜히 문제생기면 안되니까 걍 메모리 추가해야겠따.


마리아디비 슬로우쿼리를 3초나 5초등으로 적용 했는데도 슬로우쿼리에 모든 쿼리가 전부 쌓이는 증상이 있었다.


제너럴 로그였나 모든 쿼리 쌓는게 슬로우쿼리로 이름이 잘못돼있는건가... 이것저것 찾아보던중


##공식홈페이지 참고##

https://mariadb.com/kb/en/library/server-system-variables/#log_queries_not_using_indexes

log_queries_not_using_indexes

  • Description: Queries that don't use an index, or that perform a full index scan where the index doesn't limit the number of rows, will be logged to the slow query log (regardless of time taken). The slow query log needs to be enabled for this to have an effect.
  • Commandline: --log-queries-not-using-indexes
  • Scope: Global
  • Dynamic: Yes
  • Data Type: boolean
  • Default Value: OFF




위와같은 내용이 있다. 어쩌구 저쩌구 용량 관계없이 쓰여진다 뭐 이런 내용인듯. 기본값은 OFF라는데 왜 이서버들은 ON이냐



MariaDB [(none)]> SHOW VARIABLES LIKE '%log_queries_not_%';    

+-------------------------------+-------+

| Variable_name                 | Value |

+-------------------------------+-------+

| log_queries_not_using_indexes | ON    |

+-------------------------------+-------+

1 row in set (0.00 sec)


확인해보니 켜져있다.


MariaDB [(none)]> set global log_queries_not_using_indexes  = OFF;

Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> SHOW VARIABLES LIKE '%log_queries_not_%';       

+-------------------------------+-------+

| Variable_name                 | Value |

+-------------------------------+-------+

| log_queries_not_using_indexes | OFF   |

+-------------------------------+-------+

1 row in set (0.00 sec)


껏다.


해결됐다. ㅋㄷㅋㄷ

'job > mysql' 카테고리의 다른 글

mysql dead lock 확인하기  (0) 2019.01.24
mysql innodb buffer pool size  (0) 2019.01.24
mysql old패스워드 password 함수 동시 사용  (0) 2018.09.03
mysql update replace  (0) 2018.09.03
mysql history 로그 설정  (0) 2018.09.03

appcmd 


c:\Windows\System32\inetsrv>appcmd.exe list site

ERROR ( hresult:8007007a, message:항목 출력을 생성하지 못했습니다.

시스템 호출에 전달된 데이터 영역이 너무 작습니다.


ERROR ( hresult:8007007a, message:Failed to generate item output. 

The data area passed to a system call is too small. 



에러나는 이유는 


리스트에 있는 사이트들중 서브도메인갯수가 많아서 문제가 발생한다.
ㄴhttps://forums.iis.net/t/1164443.aspx?error+when+running+appcmd+list+site

찾아보니 4개의 도메인중 한개의 도메인이 서브도메인(바인딩)이 130개정도 있다. 



주요 답변

The issue was reproducible with config data bantam316 provided. It turned out appcmd has buffer limit. The error happens when <site/> has lots of data. It looks like there is no workaround with appcmd for that particular command. I would recommend to use other admin tool such as inetmgr with this situation. The feature team will address this issue.


보는바와같이 불라불라 appcmd 의 buffer limit 어쩌구 저쩌구 <site/> has lots of data 랜다. 해결방법 없고 inetmgr 을 사용하라고 한다.

ㄴ아 참고로 윈 2008R2 이고 윈 2012에서는 해결됐따는 코멘트가 있는듯 ?


inetmgr 이 무슨 또 다른 툴인가해서 찾아봤는데 그냥 iis관리자다. 어쩐지 어디서 많이 봤다했네 하여튼 그냥 직접 GUI로 봐야한다. 서브도메인이 겁내 많아가지고 복붙할라고 한건데 복붙도 안되고 하아..

'job > windows' 카테고리의 다른 글

psslack  (0) 2021.09.02
windows 서버에서 my.ini 수정하려면  (1) 2019.12.10
linux inode window fileid  (0) 2019.01.11
iis 백업 복원 이전  (0) 2018.09.03
윈도우 2012 원격 세션 제한  (0) 2018.09.03

linux 유닉스 시스템에 inode가 있는데 window 에는 inode 같은 개념은 file id 로 있다.



fsutil file queryfileid 파일명


C:\Users\7040_64bit>fsutil file queryfileid uptime.exe

파일 ID: 0x0000000000000000000900000001d3fe


위와같이 쓰면 된다.

갑자기 rsync로 파일 갯수에 따른 전송 시간이 궁금해졌다.


물론 파일이 많으면 눈에 띄겠지만... 궁금하다. 

(덮어씌기는 안하고 무조건 새파일로만)


테스트 1. 1GB 짜리 1개 파일 전송

receiving incremental file list

1G


sent 30 bytes  received 1073872969 bytes  102273618.95 bytes/sec

total size is 1073741824  speedup is 1.00


real    0m9.587s

user    0m7.625s

sys     0m3.158s


테스트 2. 1GB 짜리 5개 파일 전송

receiving incremental file list

1G

1G_1

1G_2

1G_3

1G_4


sent 106 bytes  received 5369364746 bytes  115470211.87 bytes/sec

total size is 5368709120  speedup is 1.00


real    0m46.234s

user    0m38.213s

sys     0m16.360s


테스트 3. 10GB 짜리 1개 파일 전송

receiving incremental file list

10G


sent 30 bytes  received 10738729034 bytes  114852717.26 bytes/sec

total size is 10737418240  speedup is 1.00


real    1m32.456s

user    1m15.784s

sys     0m32.694s


테스트 4. 1M 짜리 1024개 파일 전송

1M_999


sent 19467 bytes  received 1073920415 bytes  102279988.76 bytes/sec

total size is 1073741824  speedup is 1.00


real    0m10.040s

user    0m7.644s

sys     0m3.206s


테스트 5. 1M 짜리 10240개 파일 전송

1M_9999


sent 194571 bytes  received 10739207487 bytes  112454471.81 bytes/sec

total size is 10737418240  speedup is 1.00


real    1m34.970s

user    1m16.561s

sys     0m32.577s


하다 말았음 






smartctl -a /dev/sda

smartctl 5.43 2016-09-28 r4347 [x86_64-linux-2.6.32-754.6.3.el6.x86_64] (local build)

Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net


Vendor:               HPE     

Product:              LOGICAL VOLUME  


dmidecode | grep -A2 '^System Information' 

System Information

        Manufacturer: HPE

        Product Name: ProLiant DL380 Gen10


서버 스펙은 위와같다.




아래와같이 명령어 입력시 에러가 발생한다.

hpssacli ctrl all show config


Error: No controllers detected. Possible causes:

        - The driver for the installed controller(s) is not loaded.

        - On LINUX, the scsi_generic (sg) driver module is not loaded.

        See the README file for more details.



드라이버가 제대로 안올라가있나 ? 뭘 받아야하지..


일단 구글링결과


hp 공식 사이트에서는 

#modprobe sg

#modprobe hpsa hpsa_allow_any = 1

위에껄 하랜다.


hpssa 는 sg 라는 드라이버를 사용해서 설치된 컨트롤러 정보를 수집한다고 한다. 기본적으로 레드햇 7.0 은 sg드라이버를 로드하지만 7.1은 로드가 안된된다. 잉 근데 이서버는 6.9 인데 ?? 

일단 위에 명령어대로 했는데 안된다 역시 . 음.. 드라이버 설치가 안된건가.. 뭐지 ? hp 업체에 문의했다. 


hpssacli 를 hp repo 올려가지고 yum 으로 설치했는데 버전이 너무 낮다고 한다. 서버는 gen10인데 해당 서버에서는 안된다고한다.

설치돼있떤 hpssacli 버전은

rpm -qa | grep hpssacli

hpssacli-2.40-13.0.x86_64

이다.


https://support.hpe.com/hpsc/swd/public/detail?sp4ts.oid=null&swItemId=MTX_d5125e2bff7d4e92a1b0fcebc6&swEnvOid=4184

이거 받아가지고 설치하면 잘된다.

설치한 버전은

ssacli-3.30-14.0.x86_64.rpm

잘 된다.


ps.

gen10 부터는 hpssacli가 안먹는다함


tomcat 으로만 구동중인(톰캣만 가지고 80포트로 운영중인)서버에 ssl 인증서 적용하기

(인증서는 코모도같은 인증서발급업체에서 사가지고 csr,key파일까지 발급받은상태임)


구글링 해보면 많은곳에서 keytool 명령어를 이용하여 톰캣에 ssl인증서 적용하는방법을 많이 알려준다.

keytool이란 

Java provides a relatively simple command-line tool, called keytool, which can easily create a "self-signed" Certificate. Self-signed Certificates are simply user generated Certificates which have not been signed by a well-known CA and are, therefore, not really guaranteed to be authentic at all. While self-signed certificates can be useful for some testing scenarios, they are not suitable for any form of production use.


Java는 키툴이라고 하는 비교적 간단한 명령줄 도구를 제공하여 "자체 서명" 인증서를 쉽게 만들 수 있습니다. 자체 서명된 인증서는 단순히 사용자가 생성한 인증서이며, 잘 알려진 CA에서 서명한 것이 아니므로, 실제로 인증되지 않습니다. 자체 서명된 인증서는 일부 테스트 시나리오에 유용할 수 있지만 어떤 형태의 운영 사용에도 적합하지 않습니다.


톰캣 공홈에서 퍼옴  https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html


설명만 가지고는 comodo나 rapid 같은 신뢰할 수 있는 인증기관에서 발급해준게 아닌 개인이 생성한 인증서에 대해서만이라고 설명돼있는데 공홈 설명보면 그 뒤로 

Importing the Certificate

Now that you have your Certificate you can import it into you local keystore. First of all you have to import a so called Chain Certificate or Root Certificate into your keystore. After that you can proceed with importing your Certificate.


Download a Chain Certificate from the Certificate Authority you obtained the Certificate from.

For Verisign.com commercial certificates go to: http://www.verisign.com/support/install/intermediate.html

For Verisign.com trial certificates go to: http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_Root/index.html

For Trustcenter.de go to: http://www.trustcenter.de/certservices/cacerts/en/en.htm#server

For Thawte.com go to: http://www.thawte.com/certs/trustmap.html

Import the Chain Certificate into your keystore

keytool -import -alias root -keystore <your_keystore_filename>

    -trustcacerts -file <filename_of_the_chain_certificate>

And finally import your new Certificate

keytool -import -alias tomcat -keystore <your_keystore_filename>

    -file <your_certificate_filename>


위와같은 내용이 있는데 즉 keytool 을 이용해서도 인증기관에서 발급된 인증서로 적용할 수 있다는 내용이다. 실제로도 정말많이. 뭐 톰캣은 거의 대부분 keytool로 하고 있다.


keytool을 이용한 인증서 적용은 구글링에서 많이 나오니까 패쓰하고.


여기서는 ssl.key , ssl.crt, 와 인증업체에서 제공하는 체인인증서만 가지고(즉 keytool을 이용하지 않고) 아파치에 적용하는것처럼 톰캣에 적용할꺼다.


그럴려면 tomcat 에 apr라이브러리가 들어가있어야 하낟. 


apr이란 .... 잘 모르겠다 그냥 많은 기능이 포함된 라이브러리(https://kenu.github.io/tomcat70/docs/apr.html 여기보면 아파치 2점대 핵심 라이브러리라는데 근데 왜 아파치 컴파일할 때 apr을 추가로 컴파일해야하지?)이고 이 라이브러리가 톰캣에도 들어가 있으니까 아파치에 인증서 설정하는것마냥 톰캣에도 할 수 있다라고 이해할란다.


하 그냥 이러지말고 애초부터 keytool로 할껄 그랬다.


여튼 다시 정리하자면..


jsse 환경에서는 keytool을 이용하여 인증서를 적용

apr 환경에서는 기존 아파치에 적용하는것마냥 인증서를 적용 인데(톰캣에 apr 라이브러리를 사용한 환경이냐는거지 apr 환경이라는게 아파치-톰캣이 연동된 환경을 말하는게 아니다.)


톰캣에 apr 라이브러리 들어가있으니 위에 말한것처럼 나는 keytool 을 이용하지 않고 아파치에 설정하듯이 하겠다.


엄청 쉽다.

    <Connector  

        port="443" SSLEnabled="true" 

        scheme="https" secure="true" sslProtocol="TLS" SSLEngine="on"

        SSLPassword="비밀번호" 

        SSLCertificateKeyFile="conf/ssl/ssl.key"

        SSLCertificateFile="conf/ssl/ssl.crt"

        SSLCertificateChainFile="conf/ssl/chain_ssl.crt"

        SSLCACertificateFile="conf/ssl/chain_all_ssl.crt"

    />


적당한곳에다가 위내용 넣고 재시작하면된다고 한다.

근데 안된다. 그래서 결국 keytool로 했다. 하 진작에 keytool로 할껄 2시간 버렸네 




ps.

트래픽이 많이나오는 무거운 웹서버에서는 keytool 이용한 jsse 방식보다는 apr 방식에다가 인증서를 적용하는게 퍼포먼스와 안정성이 더 좋다라는 내용(이건 구글링)이 있는데

내 결론은 

그냥 편한거 하는게 좋은거같다. 안정성이나 뭐 퍼포먼스가 더 좋다는데...옛날에야 하드웨어가 안좋으니 뭐 커널튜닝이니 뭐니 퍼포먼스에 신경썼겠지만 요새는 하드웨어가 워낙 짱짱한데.. 인증서 적용하는데 그런거까지 신경쓸필요있을까 ? 



smartctl 을 이용한 디스크 점검하기

 

 

for i in `fdisk -l | grep "Disk\ \/dev\/" | awk '{print $2}' | awk -F ":|/" '{print $3}'`
##디스크 디바이스명 다 불러와서

 

###SSD / SATA&SAS 에 따라

DISK_CLASS=`cat /sys/block/$i/queue/rotational`

###0이면 SSD 1이면 SATA

if [ $DISK_CLASS = 0 ];then

elif [ $DISK_CLASS = 1 ];then

 

레이드 컨트롤러 장착 여부에 따라 디스크 체크하는 스크립트를 만들기

 

 

 

 

SSD 디스크 점검 사항
Power_On_Hours / 디스크 사용 시간

Wear_Leveling_Count / 모든 셀에 데이터가 1회 기록되면 카운트 +1
ㄴ즉 512GB 짜리 SSD에 있는 모든 저장 공간에 512GB 전체(실 사용 용량으로 치면 한...480GB 되나 ?)에 데이터가 한번씩 씌어지면 1회로 치는듯 

Airflow_Temperature_Cel / 디스크 온도

Reallocated_Sector_Ct / 섹터에 문제가 생겨서 스페어 영역으로 섹터를 이동시켰따... 즉 베드섹터
Total_LBAs_Written / 디스크에 총 write 된 사용량

 

###필드 설명###
VALUE : 속성의 현재 값(보통 백분율 단위)

WORST : 속성이 여지껏 가장 안좋았던 값

THRESH : 속성이 해당 값이 되면 안된다 하는 값 (임계값)

RAW_VALUE : 백분율로 하지 않은 현재 값

 
 

1.Power_On_Hours / 디스크 사용 시간

  9 Power_On_Hours          0x0032   098   098   000    Old_age   Always       -       6714

여기서 raw_value는 시간단위이다. 6714시간 사용했다는 뜻
여기서는 value 값을 보면된다.

THRESH 가 0 이고 VALUE 는 98 이다. 아직 여유 많다. 한 5~10 미만으로 내려가면 알람오게 설정할 예정

 

 

2.Wear_Leveling_Count / 모든 셀에 데이터가 1회 기록되면 카운트 +1

177 Wear_Leveling_Count     0x0013   099   099   000    Pre-fail  Always       -       19

이것도 RAW_VALUE는 볼 필요 없고 VALUE 만 보면 된다.

099 니까 이것도 5~10미만으로 내려가면 알람오게 설정

 

 

3.Airflow_Temperature_Cel / 디스크 온도

190 Airflow_Temperature_Cel 0x0032   073   067   000    Old_age   Always       -       27

이것도 뭐 .. VALUE 10미만이면 알람오게
 
4.Reallocated_Sector_Ct / 섹터에 문제가 생겨서 스페어 영역으로 섹터를 이동시켰따... 즉 베드섹터

  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
RAW_VALUE 가 0 이 아니라면 디스크 교체해야함

 

5.Total_LBAs_Written / 디스크에 총 write 된 사용량

241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       6174993057

이것도 VALUE 10미만이면 알람오게 하면 되나..?

정확히는 raw_value를 기준으로 계산하는법이 있다.
https://brunch.co.kr/@lars/3 요사이트에 설명 잘 돼있음
대충 요약하자면... 디스크의 총 WRITE 된 용량을 계산하고 해당 디스크가 어느정도 용량의 WRITE를 워런티? 해주는지... 말그대로 수명이다.

삼성 SSD 256기가 기준으로
RAW_VALUE(ex..6174993057) * 512 / 1024 * 1024 * 1024 * 1024 > 300 일경우 문제가 생긴다.
raw_value * 512 = 현재 write 된 사용량과 거기에 섹터 사이즈를 곱해서 실제로 write 된 용량을 확인하고..
그다음 1024 ^4 을 나눠서TB 로 계산하기 위해서다.
삼성 ssd 256 860 pro 는 300TBW를 보장한다고 한다. 300TBW란 300테라(T) 바이트(B)의 write(W)를 보장한다는 뜻이다.

 

https://www.samsung.com/semiconductor/minisite/ssd/product/consumer/860pro/ 에서 확인해보면 아래와 같다.

Warranty

  • MZ-76P256BW (256 GB)
  • 5 Years or 300 TBW
  •  
  • MZ-76P512BW (512 GB)
  • 5 Years or 600 TBW
  •  
  • MZ-76P1T0BW (1,024 GB)
  • 5 Years or 1,200 TBW
  • MZ-76P2T0BW (2,048 GB)
  • 5 Years or 2,400 TBW
  •  
  • MZ-76P4T0BW (4,096 GB)
  • 5 Year or 4,800 TBW

 

 

 

 

 

 

 

 

 

 

실제로 계산해보면... 터무니없는 용량이다... 아무리 쓰기가 빈번한 디스크라쳐도... 이걸 찾아보면서 굳이 이 스크립트를 만드는게 의미가 있는걸까 싶긴한데.... 그래도 앞으로 5년 10년 사용하면 문제가 생길테니까.. 그외 뭐 사용 시간이라던지 온도라던지... 이걸 굳이 스크립트로 짤 필요가 있나란 생각도 잠깐 들었는데 이 서버를 앞으로 3년 5년 사용하다보면 문제 생길테니까 미리 만들어놓는게 좋겠습니다.

 

 

그 외에 추가로 봐야할 속성들은..

181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Always       -       0
ㄴ프로그램 실패 갯수. 아직 한개도 없네요. 없는게 정상

182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Always       -       0

ㄴ 삭제 실패 갯수, 아직 한개도 없네요. 없는게 정상

위 두개도 더 봐주면 좋겠네요.

 

ssd 끝

#####

sata 시작

 

SATA 점검해야할 송성

 

Reallocated_Sector_Ct = SSD에서 설명함, 동일함

Seek_Error_Rate = 탐색 지연 오류 비율 이라한다. 정상일경우 0

Spin_Retry_Count = 오류로 멈추었따가 구동된 횟수  정상일경우 0

Current_Pending_Sector = 명령시간 초과 횟수 정상일경우 0

Offline_Uncorrectable = 수정 할 수 없는 에러 발생, 정상일경우 0

UDMA_CRC_Error_Count = 케이블 뷸량, 파티션간 에러, 정상일경우 0

ㄴ이거는 몇몇 서버에서 0 아닌서버들이 적잖이 있음, 이런 서버는 디스크, 혹은 케이블등 점검이 필요한 것같다.

 

전부 raw_value 기준이다.

 

 

그 외에... 

 

Raw_Read_Error_Rate = 디스크raw단에서 데이터 읽는 과정에서 문제가 있을 경우(sata가 뺑글뺑글 돌면서 물리적인 표면에서 읽을 때 문제가 있을경우인듯) 물리적인 부분이라 물리적인 충격에 의해 발생한다고 함, 이거는 정상이라면 0이어야 하는데 0 아닌 서버들이 겁나게 많다. 완벽주의자면... 다 교체 해주던가... 난 패쓰해도 될꺼같다.... 추가로 SSD는 0인 디스크들이 대부분인반면 SATA는 0인 서버를 찾을 수가 없다. 이건 뭐.. ssd 플래시 메모리 방식과 sata 구동방식의 차이 때문 아닐까 혼자 짐작해본다.

 

 

###########

nvme 설명

 

available_spare                     : 100%     

available_spare_threshold           : 4%

percentage_used                     : 0%

controller_busy_time                : 2,502

unsafe_shutdowns                    : 4

media_errors                        : 0

 

 

요약하자면

 

1. available_spare < available_spare_threshold  이 되면 위험 , spare 영역 어쩌구 저쩌구
2. percentage_used 100% 넘어가면 위험함, 밴더사별로 내놓은 워런티? 수명? 뭐 그런거임

3. controller_busy_time 분단위인데.... 바쁘게(I/O 큐가 밀려있을때) 움직인 시간... 대기작업이 많이 있는경우 올라가는거라 정상인것같다.(정확하지 않다.) 0인 서버 못찾음

4. unsafe_shutdowns 말그대로임, 서버 강종하지말자.

5. media_errors 는 1 되면 배드섹터 감지된거니까 교체해야함

 

nvme는 모니터링해야되는게
1. available_spare < available_spare_threshold 

2. percentage_used > 100 

3.media_errors > 0

 

위 3개정도 하면 될듯하다.

 

###

 

sas 는 total uncorrected erros 이 항목만 보연 된댄다.

 

        SAS=`smartctl -a /dev/$i | grep Transport | wc -l`

        if [ $SAS != 0 ];then

        TUE=`smartctl -d /dev/$i  | egrep "read:|write:|verify:" | awk '{print $8}'`

                for sas_disk in $TUE

                do

                        if [ $sas_disk -gt 0 ];then

                        echo -ne "\033[33m Disk Total uncorrected error check\n"

                        echo -e "\033[0m"

                        fi

                done

        fi

 

 

################

마지막으로 레이드 컨트롤러가 장착돼있을 경우 smartctl 하는 방법

 

 

HP서버

 

smartctl -a -d cciss,디스크넘버 /dev/sda

 

EC2 = VM 서버

EBS = 블록 스토리지, 물리적인 디스크라고 생각하면 될듯, 장착한 용량만큼 과금

EFS = 메니지드 파일 스토리지, 네트워크 기반으로 마운트, 사용중인 용량만큼 과금

S3 = 오브젝트 스토리지,네이버 클라우드마냥 용량제한없이 폴더개념으로 파일 저장, 사용중인 용량만큼 과금(단 트래픽 요금 발생, 저장할땐 무료 꺼낼땐 과금)

security group = EC2에 장착시켜서 start함, 기본적인 방화벽이라고 보면 됨

key pairs = ssh-keygen이랑 동일함

glacier = 아카이브

ELB=로드밸런싱

VPC=isolated resources(IDC)

route53=웹DNS

network acls=방화벽

보안=  identity&access / key sotoage&management / active directory / ddos protection / application analysis / certificate management / web App-firewall

관리 도구 = Monitoring / Auditing / ServiceCatalog / Server / Management / Configuration / Tracking / Optimization / Resource / T emplates / Automation



'job > public cloud' 카테고리의 다른 글

AWS스터디 - S3  (0) 2022.11.15
aws 스터디 - rds  (0) 2022.11.14
AWS스터디 - EC2, EBS, ELB, Route53  (0) 2022.11.14
AWS 스터디 - IAM  (0) 2022.11.14
aws SAA(AWS Certified Solutions Architect - Associate) 불합격 & 합격 후기  (6) 2020.05.12

SSH 연결시 각 서버의 패스워드는 ansible_ssh_pass 을 통해 패스워드를 미리 적어둘 수 있다.


ansbile/hosts 에
클라이언트 아이피         ansible_user=root       ansible_ssh_pass=패스워드




보안상 취약하기 때문에 따로 파일로 보관하다가 실제로 사용할때만 업로드해서 써야할듯

'job > ansible' 카테고리의 다른 글

ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-3 playbook  (0) 2019.04.25
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22
ansible-1  (0) 2019.04.10

https://blog.naver.com/alice_k106/221333208746

'job > open source' 카테고리의 다른 글

zimbra 오픈소스 웹메일 짐브라  (0) 2018.09.03
netdata 설치하기  (0) 2018.08.31

split 찢다.


내가 지정하는 문구를 구분자로 나눌 수 있다. , 콤마로 나눈다.




 command

target 

value 

 store

 안녕하세요. [스플릿] 입니다! 반가워요 ~

 list

 storeEval

 storedVars.list.split('입니다!' );

 test_split

 echo

${test_split} 

 


결과 : 안녕하세요. [스플릿] , 반가워요 ~
## 위와같이 "입니다!" 라는 문구를 구분자로해서 안녕하세요. [스플릿] 와 반가워요 ~ 로 바뀌었다. 




아래와같이 여러번 스플릿하여 빼고자 하는 단어만 남길 수 있따.

 command

target 

value 

 store

 안녕하세요. [스플릿] 입니다! 반가워요 ~

 list

 storeEval

 split2=storedVars.list.split('하세요. [' )

 split2=split2[1].split('] 입니다!');

 split2=split2[0]

 test_split

 echo

${test_split} 

 

결과 : 스플릿



'job > selenium' 카테고리의 다른 글

substr  (0) 2018.09.05
indexOf  (0) 2018.09.05

아래는 1TB raid 1 로 SSD 480GB * 2ea / raid 0 으로 SATA 1TB 구성돼있는 상태이고 추가로 SATA 1TB 레이드 안잡혀있는, 즉 디스크 만 꼽혀있는 상태이다.


[root@localhost ~]#  hpssacli ctrl all show config


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   unassigned


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK) 
##주석##추가 디스크임, 레이드를 안잡았으니 logicaldrive 정보가 없고
 unassigned 으로 표기됨을 확인할 수 있음



1.레이드를 잡기 위해선 레이드 컨트롤러가 장착된 슬롯 번호physicaldrive 번호 확인이 필요하다.


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   unassigned


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK)



2.슬롯번호와 physicaldrive 를 확인하였으면 레이드 설정하는 명령어를 입력한다.

[root@localhost ~]# hpssacli ctrl slot=2 create type=ld drives=1I:1:4 raid=0

###레이드 컨트롤러 슬롯번호는 2번이고(slot=2) 생성 타입은 로지컬 드라이브(create type=ld) 대상 디스크(drives=1I:1:4) 생성할 레이드 타입은 raid 0(raid=0)

###raid 1 또는 raid 5를 하려면 아래와같이 디스크 번호 추가해주고 raid 적어주면된다.###

hpssacli ctrl slot=0 create type=ld drives=1I:1:1,1I:1:2 raid=1

hpssacli ctrl slot=0 create type=ld drives=1I:1:1,1I:1:2,2I:1:6,2I:1:7,2I:1:8 raid=5




3.작업 완료후 레이드 상태를 보면 logical drive 3 이 추가된것을 확인할 수 있다. 또한 fdisk를 통해 디스크 추가를 확인할 수 있다.

[root@localhost ~]#  hpssacli ctrl all show config


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   array C (SATA, Unused Space: 0  MB)



      logicaldrive 3 (931.5 GB, RAID 0, OK)  ###원래는 unassigned 였는데 레이드 0으로 잡아줬으니 변경됨


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK)



[root@localhost ~]# fdisk -l


Disk /dev/sda: 480.1 GB, 480070426624 bytes

255 heads, 63 sectors/track, 58365 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 262144 bytes / 262144 bytes

Disk identifier: 0x0009a5c1


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1          27      215040   83  Linux

/dev/sda2              27         288     2097152   82  Linux swap / Solaris

/dev/sda3             288       58366   466505560   83  Linux


Disk /dev/sdb: 1000.2 GB, 1000171331584 bytes

255 heads, 63 sectors/track, 121597 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 262144 bytes / 262144 bytes

Disk identifier: 0x0009a5c1


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1          27      215040   83  Linux

/dev/sdb2              27         288     2097152   82  Linux swap / Solaris

/dev/sdb3             288      121597   974414686+  83  Linux


Disk /dev/sdc: 1000.2 GB, 1000171331584 bytes

255 heads, 63 sectors/track, 121597 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 262144 bytes / 262144 bytes

Disk identifier: 0x97d80c0a






레이드 삭제하는법


1.위에서 추가한 logicaldrive 3 (931.5 GB, RAID 0, OK) 을 삭제하겠다.
[root@localhost ~]# hpssacli ctrl slot=2 ld 3 delete        ###슬롯2번의 레이드컨트롤러의 로지컬드라이브 3번(ld 3) 을 삭제하겠다.

Warning: Deleting an array can cause other array letters to become renamed.

         E.g. Deleting array A from arrays A,B,C will result in two remaining

         arrays A,B ... not B,C

##### 각 로지컬 드라이브 앞에 array A (디스크 정보) 이런식으로 A , B , C 나오는데 중간에 B 를 삭제하면 array A, C 가 아니라 A, B 가 된다는 얘기 별 중요하지 않음


Warning: Deleting the specified device(s) will result in data being lost.

         Continue? (y/n) y   

###데이터 삭제하니까 정말 진행할꺼냐




##########

Error: Unable to delete logicaldrive 2. Please verify that the logical drive is

       the last logical drive on the array and no other operations are being

       performed on it.


Reason: In use by os
위와같은 에러 발생했다. 파티션이 마운트 돼 있는지 확인해봐야한다. 마운트돼있따 ㅋㅋ 마운트 푸니까 잘 된다.
############




[root@localhost ~]#  hpssacli ctrl all show config  


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   unassigned #### logicaldrive 3번이 삭제된것을 확인할 수 있다.


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK)



링크(디스크 불) on/off 하는법

hpssacli ctrl slot=0 ld 2 modify led=on


hpssacli ctrl slot=0 ld 2 modify led=off

substring , substr 등 C나 php등 많은언어에서 사용되는것과 동일함


사용법은 아래와 같다


storeEval    []                                                                         num

push        12345123                                                               num

storeEval    storedVars.echo_stat.substr(0,2);                                 check

echo${check}


결과값 12          ####12345123 문자중 0번째부터 해당문자포함 뒤로 2번째(쉽게 보면 2글자라고 봐도 될듯)까지만 $check에 반환



storeEval    []                                                                         num

push        12345123                                                               num

storeEval    storedVars.echo_stat.substr(1,1);                                 check

echo${check}


결과값 2          ####12345123 문자중 1번째 문자부터 해당문자포함 뒤로 1글자만 $check에 반환




storeEval    []                                                                         num

push        12345123                                                               num

storeEval    storedVars.echo_stat.substr(3,1);                                 check

echo${check}


결과값 4          ####12345123 문자중 3번째 문자부터 해당문자포함 뒤로 1글자만 $check에 반환



storeEval    []                                                                         num

push        12345123                                                               num

storeEval    storedVars.echo_stat.substr(3,2);                                 check

echo${check}


결과값 45          ####12345123 문자중 3번째 문자부터 해당문자포함 뒤로 2글자만 $check에 반환





아래와 같이 indexOf 와도 함께 사용이 가능하다.


storeEval    []                                                                         num

push        12345123                                                               num

storeEval    storedVars.echo_stat.substr(3,2).indexOf("4");                 check

echo${check}


결과값 0          ####12345123 문자중 3번째 문자부터 해당문자포함 뒤로 2글자만 반환, 값은 45이고 그중 idnexOf로 4가 들어가는 문자열의 위치를 찾았다. 0번째니까 값은 0





storeEval    []                                                                         num

push        12345123                                                               num

storeEval    storedVars.echo_stat.substr(3,2).indexOf("5");                 check

echo${check}


결과값 1          ####12345123 문자중 3번째 문자부터 해당문자포함 뒤로 2글자만 반환, 값은 45이고 그중 idnexOf로 5가 들어가는 문자열의 위치를 찾았다. 1번째니까 값은 1




storeEval    []                                                                         num

push        12345123                                                               num

storeEval    storedVars.echo_stat.substr(3,2).indexOf("6");                 check

echo${check}


결과값 -1          ####12345123 문자중 3번째 문자부터 해당문자포함 뒤로 2글자만 반환, 값은 45이고 그중 idnexOf로 6가 들어가는 문자열의 위치를 찾았다. 6 자체가 안들어가니까 값은 -1




글자 자르는거라 많이많이 유용함



'job > selenium' 카테고리의 다른 글

split  (0) 2018.09.06
indexOf  (0) 2018.09.05

javascript 의 indexOf 이다.


storeEval    []                                                 num

push        12345123                                       num

storeEval    storedVars.num.indexOf("12");            check

echo${check1}


결과값 0          ####12345123 문자중 12가 들어가는게 처음부터 0번째이기 때문에 값은 0



storeEval    []                                                 num

push        12345123                                       num

storeEval    storedVars.num.indexOf("2");            check

echo${check1}


결과값 1       ####12345123 문자중 2가 들어가는게 처음부터 1번째(0부터시작)이기 때문에 값은 1


storeEval    []                                                 num

push        12345123                                       num

storeEval    storedVars.num.indexOf("6");            check

echo${check1}


결과값 -1       ####12345123 문자중 6이 들어가지 않기 때문에 값은 -1(찾는 문자열이 없을경우 -1을 반환함)



찾는문자열의 위치를 찾는것보단 문자열이 있는지 없는지를 사용하는편인듯

쉘에서는 grep 으로 쉽게 되는데 셀레니움은(javascript) 익숙치 않아서 그런지 아직 어렵다.(있는데 모르는걸수도)

'job > selenium' 카테고리의 다른 글

split  (0) 2018.09.06
substr  (0) 2018.09.05

/ : 루트디렉토리
|-- HISTORY : 패치된 내역
|-- LICENSE : 그누보드4 라이센스, 저작권(Copyright)
|-- _common.php : 상대경로를 이용하여 루트에 있는 common.php 파일을 include
|-- _head.php : 상대경로를 이용하여 루트에 있는 head.php 파일을 include
|-- _tail.php : 상대경로를 이용하여 루트에 있는 tail.php 파일을 include
|-- adm : 관리자 디렉토리
|   |-- _common.php : 상대경로를 이용하여 루트에 있는 common.php 파일 include
|   |-- admin.head.php : 관리자 페이지 상단+오른쪽 디자인 관련 파일
|   |-- admin.js : 관리자 페이지 자바스크립트 파일
|   |-- admin.lib.php : 관리자 페이지 라이브러리 파일
|   |-- admin.menu100.php : 관리자 페이지 환경설정 메뉴
|   |-- admin.menu200.php : 관리자 페이지 회원관리 메뉴
|   |-- admin.menu300.php : 관리자 페이지 게시판관리 메뉴
|   |-- admin.menu400.shop_1of2.php : 관리자 페이지 쇼핑몰 관리 메뉴
|   |-- admin.menu500.shop_2of2.php : 관리자 페이지 쇼핑몰 현황 메뉴
|   |-- admin.style.css : 관리자 페이지 스타일시트
|   |-- admin.tail.php : 관리자 페이지 오른쪽+하단 디자인 관련 파일
|   |-- auth_list.php : 관리권한설정 리스트
|   |-- auth_list_delete.php : 관리권한설정 선택 삭제
|   |-- auth_update.php : 관리권한설정 반영
|   |-- board_copy.php : 게시판 복사 폼
|   |-- board_copy_update.php : 게시판 복사 반영
|   |-- board_delete.inc.php : 게시판 삭제 include 파일
|   |-- board_delete.php : 게시판 삭제
|   |-- board_form.php : 게시판 설정 폼
|   |-- board_form_update.php : 게시판 설정 반영
|   |-- board_list.php : 게시판 리스트 
|   |-- board_list_delete.php : 게시판 선택 삭제
|   |-- board_list_update.php : 게시판 선택 수정
|   |-- boardgroup_delete.php : 게시판 그룹 삭제
|   |-- boardgroup_form.php : 게시판 그룹 설정 폼
|   |-- boardgroup_form_update.php : 게시판 그룹 설정 반영
|   |-- boardgroup_list.php : 게시판 그룹 리스트
|   |-- boardgroup_list_update.php : 게시판 그룹 선택 수정
|   |-- boardgroupmember_form.php : 게시판 그룹 접근회원 설정 폼
|   |-- boardgroupmember_list.php : 게시판 그룹 접근회원 리스트
|   |-- boardgroupmember_update.php : 게시판 그룹 접근회원 설정 반영
|   |-- config_form.php : 기본환경설정 폼
|   |-- config_form_update.php : 기본환경설정 반영
|   |-- img : 관리자 이미지 디렉토리
|   |-- index.php : 관리자 시작페이지
|   |-- mail_form.php : 회원메일 발송 폼
|   |-- mail_list.php : 회원메일 발송 리스트
|   |-- mail_preview.php : 작성한 회원메일 미리보기
|   |-- mail_select_form.php : 회원메일 대상회원 선택 폼
|   |-- mail_select_list.php : 선택된 회원 리스트
|   |-- mail_select_update.php : 회원메일을 대상회원에게 발송
|   |-- mail_test.php : 작성한 회원메일을 관리자에게 테스트 발송
|   |-- mail_update.php : 메일 작성 반영
|   |-- member_delete.php : 회원 삭제
|   |-- member_form.php : 회원 등록, 설정 폼
|   |-- member_form_update.php : 회원 등록, 설정 반영
|   |-- member_list.php : 회원 리스트
|   |-- member_list_delete.php : 회원 선택 삭제
|   |-- member_list_update.php : 회원 선택 수정
|   |-- phpinfo.php : php, mysql 등의 설치 정보
|   |-- point_clear.php : 포인트 내역 정리 (내역이 많다면 포인트를 합산하여 레코드를 줄입니다.)
|   |-- point_list.php : 포인트 내역 리스트
|   |-- point_list_delete.php : 포인트 내역 선택 삭제
|   |-- point_update.php : 포인트 내역 등록
|   |-- poll_form.php : 설문조사 등록 폼
|   |-- poll_form_update.php : 설문조사 등록 반영
|   |-- poll_list.php : 설문조사 리스트
|   |-- repair.php : 복구 및 최적화
|   |-- sendmail_test.php : 메일 테스트
|   |-- sql_write.sql : 게시판 TABLE 생성 쿼리 (이 파일이 없으면 게시판 생성을 할 수 없음)
|   |-- upgrade.php : TABLE 에 FIELD 변경이 있는 경우에만 실행 (패치내역에서 알림)
|   |-- version.php : 그누보드4 버전 확인 (루트의 HISTORY 파일 내용)
|   |-- visit.sub.php : 접속자 SUB
|   |-- visit_browser.php : 브라우저별 접속자 현황
|   |-- visit_date.php : 일별 접속자 현황
|   |-- visit_domain.php : 도메인별 접속자 현황
|   |-- visit_hour.php : 시간대별 접속자 현황
|   |-- visit_list.php : 기간별 접속자 리스트
|   |-- visit_month.php : 월별 접속자 현황
|   |-- visit_os.php : OS별 접속자 현황
|   |-- visit_week.php : 요일별 접속자 현황
|   `-- visit_year.php : 연별 접속자 현황
|-- bbs : 그누보드4 핵심 디렉토리
|   |-- _common.php : 상대경로를 이용하여 루트에 있는 common.php 파일 include
|   |-- _head.php : 상대경로를 이용하여 루트에 있는 head.php 파일 include
|   |-- _tail.php : 상대경로를 이용하여 루트에 있는 tail.php 파일 include
|   |-- board.php : 게시판 글 리스트, 상세보기
|   |-- board_head.php : 게시판 상단
|   |-- board_tail.php : 게시판 하단
|   |-- calendar : 달력 디렉토리
|   |   `-- 2005.txt : 연도별 국경일, 공휴일, 행사 표시
|   |-- calendar.php : 달력
|   |-- current_connect.php : 현재 접속자 리스트
|   |-- delete.php : 게시물 삭제
|   |-- delete_all.php : 게시물 선택 일괄 삭제
|   |-- delete_comment.php : 코멘트 삭제
|   |-- download.php : 업로드된 파일 다운로드
|   |-- email_certify.php : E-mail 인증
|   |-- email_stop.php : E-mail 수신거부
|   |-- formmail.php : 폼메일
|   |-- formmail_send.php : 폼메일 보내기
|   |-- good.php : 추천, 비추천 반영
|   |-- group.php : 같은 그룹에 속한 게시판 최신글 리스트
|   |-- img : 이미지 디렉토리
|   |-- link.php : 링크 카운트 반영
|   |-- list.php : 게시물 리스트
|   |-- login.php : 로그인
|   |-- login_check.php : 로그인 체크
|   |-- logout.php : 로그아웃
|   |-- member_confirm.php : 회원정보 수정전에 회원인지를 확인
|   |-- member_email_check.php : 회원가입시 E-mail 중복 확인
|   |-- member_id_check.php : 회원가입시 회원아이디 중복 확인
|   |-- member_leave.php : 회원 탈퇴
|   |-- member_nick_check.php : 회원가입시 별명 중복 확인
|   |-- memo.php : 쪽지 리스트
|   |-- memo_delete.php : 쪽지 삭제
|   |-- memo_form.php : 쪽지 작성 폼
|   |-- memo_form_update.php : 쪽지 보내기
|   |-- memo_view.php : 쪽지 상세보기
|   |-- move.php : 게시물 이동, 복사 게시판 선택
|   |-- move_update.php : 선택된 게시판에 게시물 이동, 복사
|   |-- new.php : 최근게시물 (모든 게시판)
|   |-- norobot.inc.php : 프로그램에 의한 게시물 자동등록 방지 코드 생성
|   |-- norobot_check.inc.php : 프로그램에 의한 게시물 자동등록 검사
|   |-- password.php : 패스워드 입력 폼
|   |-- password_check.php : 패스워드 검사
|   |-- password_forget.php : 회원아이디/패스워드 분실 1/3 단계
|   |-- password_forget2.php : 회원아이디/패스워드 분실 2/3 단계
|   |-- password_forget3.php : 회원아이디/패스워드 분실 3/3 단계
|   |-- point.php : 회원 포인트 내역 (로그인한 해당 회원에 대한 내역)
|   |-- poll_etc_update.php : 설문조사 기타의견 반영
|   |-- poll_etc_update_mail.php : 설문조사 기타의견 메일 템플릿
|   |-- poll_result.php : 설문조사 결과
|   |-- poll_update.php : 설문조사 선택된 항목 반영
|   |-- profile.php : 자기소개
|   |-- register.php : 회원가입 약관
|   |-- register_form.php : 회원가입 폼
|   |-- register_form_update.php : 회원가입
|   |-- register_form_update_mail1.php : 회원가입 축하 메일 템플릿 (회원님께 발송)
|   |-- register_form_update_mail2.php : 회원가입 메일 템플릿 (관리자님께 발송)
|   |-- register_form_update_mail3.php : E-mail 인증 메일 템플릿 (회원님께 발송)
|   |-- register_result.php : 회원가입 결과
|   |-- rss.php : XML 기반으로 된 최신글 (RSS Reader 로 조회)
|   |-- scrap.php : 스크랩 리스트
|   |-- scrap_delete.php : 스크랩 삭제
|   |-- scrap_popin.php : 스크랩 폼
|   |-- scrap_popin_update.php : 스크랩 반영
|   |-- search.php : 게시판 통합 검색 (게시판 설정에서 검색 사용에 체크된 게시판에서만 검색)
|   |-- tb.php : 트랙백 핑 받는 페이지
|   |-- view.php : 게시물 보기
|   |-- view_comment.php : 코멘트 보기
|   |-- visit.inc.php : 방문자 보기
|   |-- visit_insert.inc.php : 방문자 반영
|   |-- write.php : 게시글 등록 폼
|   |-- write_comment_update.php : 코멘트 등록
|   |-- write_update.php : 게시글 등록
|   |-- write_update_mail.php : 게시글 등록 메일 템플릿
|   |-- zip.db : 우편번호 정보 DB
|   `-- zip.php : 우편번호 검색창
|-- cheditor : DHTML 에디터 디렉토리
|-- common.php : 공통으로 사용하는 코드 (lib/common.lib.php 와 extend 디렉토리를 기본으로 포함)
|-- config.php : 변수, 상수 설정 (common.php 에서 include)
|-- convert : 변환 프로그램 모음 디렉토리
|-- data : 파일 업로드 데이터 디렉토리 
|   |-- cheditor : DHTML 에디터 데이터 디렉토리
|   |   `-- 0511 : 이미지의 업로드 디렉토리를 연월별로 생성
|   |-- file : 게시판 디렉토리
|   |   |-- basic : 게시판별로 별도의 디렉토리가 생성됨
|   |   `-- qa
|   |-- member : 회원 데이터 디렉토리 (회원아이디의 앞 두자리로 디렉토리를 개별 생성함)
|   `-- session : 세션 디렉토리 (로그인 여부 등)
|-- dbconfig.php : DB 설정파일 (없으면 프로그램을 설치함)
|-- head.php : 기본 상단+왼쪽 디자인 관련 페이지
|-- head.sub.php : 공통으로 사용하는 자바스크립트 변수를 선언, 스타일시트, 자바스크립트를 포함
|-- img : 기본 이미지 디렉토리
|-- index.php : 시작 페이지
|-- js : 자바스크립트 소스 디렉토리
|   |-- common.js : 일반적인 자바스크립트
|   |-- filter.js : 글등록시 금지단어 필터링 자바스크립트
|   |-- md5.js : MD5 자바스크립트
|   |-- sideview.js : 이름(별명)에 왼쪽 마우스 클릭시 나타나는 레이어 자바스크립트
|   |-- wrest.gif : 필수 입력 이미지
|   `-- wrest.js : 폼 입력 필드 체크 자바스크립트
|-- lib : 함수 라이브러리 디렉토리
|   |-- cheditor.lib.php : DHTML 에디터 라이브러리
|   |-- common.lib.php : 공통 라이브러리
|   |-- connect.lib.php : 현재 접속자 라이브러리
|   |-- etc.lib.php : 기타 라이브러리 (로그 파일에 기록하는 함수 등)
|   |-- latest.lib.php : 최신글 라이브러리
|   |-- mailer.lib.php : 메일 라이브러리
|   |-- outlogin.lib.php : 외부로그인 라이브러리
|   |-- poll.lib.php : 설문조사 라이브러리
|   |-- popular.lib.php : 인기검색어 라이브러리
|   |-- trackback.lib.php : 트랙백 라이브러리
|   `-- visit.lib.php : 방문자 라이브러리
|-- perms.sh : 데이터 디렉토리 퍼미션 변경 쉘 프로그램
|-- skin : 스킨 디렉토리
|   |-- board : 게시판 스킨
|   |   `-- basic : 기본 스킨
|   |       |-- delete.skin.php : 게시물 삭제
|   |       |-- delete_all.skin.php : 게시물 선택 삭제
|   |       |-- download.skin.php : 첨부파일 다운로드
|   |       |-- list.skin.php : 게시물 리스트
|   |       |-- view.skin.php : 게시물 상세보기
|   |       |-- view_comment.skin.php : 코멘트 보기
|   |       |-- write.skin.php : 게시물 등록 폼
|   |       `-- write_update.skin.php : 게시물 등록
|   |-- connect : 접속자 스킨
|   |   `-- basic : 기본 스킨
|   |       |-- connect.skin.php : 접속자 통계
|   |       `-- current_connect.skin.php : 현재접속자 리스트
|   |-- latest : 최신글 스킨
|   |   `-- basic : 그누보드4 기본 스킨
|   |       `-- latest.skin.php : 최신글 (게시판별로 각각 지정)
|   |-- member : 회원 스킨
|   |   |-- basic : 그누보드4 기본 스킨
|   |   |   |-- calendar.skin.php : 달력
|   |   |   |-- formmail.skin.php : 폼메일
|   |   |   |-- login.skin.php : 로그인
|   |   |   |-- login_check.skin.php : 로그인 체크
|   |   |   |-- member_confirm.skin.php : 회원 패스워드 확인
|   |   |   |-- memo.skin.php : 쪽지
|   |   |   |-- memo_form.skin.php : 쪽지 폼
|   |   |   |-- memo_view.skin.php : 쪽지 상세보기
|   |   |   |-- password.skin.php : 비밀글 조회시 패스워드 입력
|   |   |   |-- password_forget.skin.php : 회원아이디, 패스워드 찾기 1
|   |   |   |-- password_forget2.skin.php : 회원아이디, 패스워드 찾기 2
|   |   |   |-- password_forget3.skin.php : 회원아이디, 패스워드 찾기 3
|   |   |   |-- profile.skin.php : 자기소개
|   |   |   |-- register.skin.php : 회원가입 약관
|   |   |   |-- register_form.skin.php : 회원 등록 폼
|   |   |   |-- register_result.skin.php : 회원가입 결과
|   |   |   |-- register_update.skin.php : 회원 등록
|   |   |   |-- scrap.skin.php : 스크랩
|   |   |   |-- scrap_popin.skin.php : 스크랩 등록
|   |   |   `-- zip.skin.php : 우편번호 찾기
|   |-- new : 최근게시물 스킨 디렉토리
|   |   `-- basic : 기본 스킨
|   |       `-- new.skin.php : 최근게시물 리스트 (게시판 통합 최신글)
|   |-- outlogin : 외부(아웃) 로그인 스킨 디렉토리
|   |   `-- basic : 그누보드4 기본 스킨
|   |       |-- outlogin.skin.1.php : 로그인 이전
|   |       `-- outlogin.skin.2.php : 로그인 이후
|   |-- poll : 설문조사 스킨 디렉토리
|   |   `-- basic : 그누보드4 기본 스킨
|   |       |-- poll.skin.php : 설문조사 항목 선택
|   |       `-- poll_result.skin.php : 설문조사 결과
|   |-- popular : 인기검색어 스킨 디렉토리
|   |   `-- basic : 기본 스킨
|   |       `-- popular.skin.php : 인기검색서 출력
|   |-- search : 게시판 검색 스킨 디렉토리
|   |   `-- basic : 기본 스킨
|   |       `-- search.skin.php : 게시판 검색
|   `-- visit : 방문자 수 스킨 디렉토리
|       `-- basic : 그누보드4 기본 스킨
|           `-- visit.skin.php : 방문자 수 출력
|-- style.css : 스타일시트
|-- tail.php : 기본 오른쪽+하단 디자인 관련 페이지
`-- tail.sub.php : 공통으로 사용하는 폼 검사 자바스크립트(wrest.js)를 포함

+ Recent posts