https://www.comodossl.co.kr/products/ssl-checker.aspx



SSL 인증서 적용 상태 테스트 툴 - HanbiroSSL

www.comodossl.co.kr


https://www.geocerts.com/ssl_checker

리눅스 시스템을 운영하다 보면  시스템 Hang-up에 대한  문제점을 많이 들어나게 됩니다. 물론  리눅스 시스템 
자체의 문제점이라고 보다는 특정 운영 프로세스에 대해서 인터럽트 또는 스케쥴이 정상적으로 진행되지 못했을때 나타는 문제점에 대해서 간략해 소개해 보고자 합니다.

갑자기 시스템  로그에서 출력하게된 /var/log/message 의 시스템 로그.

kernel: INFO: task startup.sh:9902 blocked for more than 120 seconds.
 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this messag
 kernel: startup.sh    D 0000000000000008     0  9902   7811 0x00000004
 kernel: ffff880828f17ce8 0000000000000082 ffff88081c2aeaa0 ffff88081c2aeaa0
 kernel: ffff88081c2aeaa0 ffffea00378c0d98 ffff88081c2aeaa0 0000010100001e60
 kernel: ffff88081c2af058 ffff880828f17fd8 000000000000fb88 ffff88081c2af058
 kernel: Call Trace:
 kernel: [<ffffffffa00accf0>] ? ext4_file_open+0x0/0x130 [ext4]
 kernel: [<ffffffff814eae85>] schedule_timeout+0x215/0x2e0
 kernel: [<ffffffff81174234>] ? nameidata_to_filp+0x54/0x70
 kernel: [<ffffffff81268d39>] ? cpumask_next_and+0x29/0x50
 kernel: [<ffffffff814eab03>] wait_for_common+0x123/0x180
 kernel: [<ffffffff8105fa40>] ? default_wake_function+0x0/0x20
 kernel: [<ffffffff814eac1d>] wait_for_completion+0x1d/0x20
 kernel: [<ffffffff8106155c>] sched_exec+0xdc/0xe0
 kernel: [<ffffffff8117ee90>] do_execve+0xe0/0x2c0
 kernel: [<ffffffff810095ea>] sys_execve+0x4a/0x80
 kernel: [<ffffffff8100b4ca>] stub_execve+0x6a/0xc0

[예상 문제점 1]
시스템 로그에서 나타난  kernel:INFO: task 의 메세지를 나타내는 의미는 현재 운영하고자 하는 startup.sh 
스크립트에 대해서  120초 (2분 default) 동안 khungtaskd  쓰레드에서 D-state 상태를 감지하여  call trace 
를 호출하게 되는  상황으로 예측할 수 있습니다. 

[예상 문제점2]
시스템의 성능저하 특히 레드햇의 보고서에 의하면 디스크의 heavy I/O 로 나타나는 문제점으로 
예측될수 있습니다. 

[예상 문제점 2]
운영되고 있는 Application에 대해서 "D-state" (Uninterruptible sleep) 모드가 120초 동안 지속되었을때
예측될수 있는 문제로  해당 프로세스가 정상적으로 스케쥴링이 일어나지 않았을 때도 나타나게 됩니다

[ D-state 원인분석을 위해서는 ? ]
위와같은 문제점에 대해서 접근할수 있는 기본적인 방법에 대해서는  정확한 문제점을  파악하기 위해서는  커널의 덤프를 이용하여 core를 분석하는 것이 가장 정확할수 있습니다. core를 분석하기 위한 방법론에 대해서는 다음 
블로깅을 통하여 소개하도록 하겠습니다. 

# echo 1 > /proc/sys/kernel/hung_task_panic

위와 같이  kernel core를  생성하기 위해 설정을 진행한 후 동일한 현생이 발생되어 core가 생성이 되면 문제가
되는 운영 프로세스의 D-state 문점에 대해서 분석이 가능합니다. 

[ hung_task_timeout을 Disable 시켜라]
기본적인 Work-Arround에 대해서는  아래와 같이 hung_task_timeout 부분에 대해서 Disable 시켜주는 것을 권장하고 있습니다. 

#  echo 0 > /proc/sys/kernel/hung_task_timeout_secs

위와 같이  커널에서 Hang Time OUt 을 체크하는 부분에 대해서 Disable 시켜준 후에는  call trace 여부가 지속적으로 발생되는지  모니터링이 필요합니다. 만약  해당 프로세스에 대해서  Uninterrupt sleep이 지속적으로 발생한다면 커널 업데이트 또한 고려해야 합니다.



출처: http://ssambback.tistory.com/entry/서버가-응답이-없어요INfotask-processpid-lock-for-more-than-120-seconds [Rehoboth.. 이곳에서 부터]

출처: http://ssambback.tistory.com/entry/서버가-응답이-없어요INfotask-processpid-lock-for-more-than-120-seconds [Rehoboth.. 이곳에서 부터]

Mar 24 11:19:15 grep-r kernel: You need to implement a remote task_setrlimit in your security module and call it directly from this functionWARNING: at security/security.c:51 security_o
ps_task_setrlimit()
Mar 24 11:19:15 grep-r kernel: 
Mar 24 11:19:15 grep-r kernel: Call Trace:
Mar 24 11:19:15 grep-r kernel: [<ffffffff8012f05b>] security_ops_task_setrlimit+0x87/0x96
Mar 24 11:19:15 grep-r kernel: [<ffffffff8009dc2f>] do_prlimit+0xd7/0x1d2
Mar 24 11:19:15 grep-r kernel: [<ffffffff8009ed78>] sys_setrlimit+0x36/0x43
Mar 24 11:19:15 grep-r kernel: [<ffffffff8005d116>] system_call+0x7e/0x83
Mar 24 11:19:15 grep-r kernel:

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

https://www.redhat.com/archives/rhelv5-list/2013-January/msg00009.html


이거 콜 트레이스는 무시해도됨


kill -9 $(ps -ef | grep "error\/warning check" | awk '{print $2}')

yum install -y ncdu





du보다 속도도 빠르고 디렉토리별로 나열해서 보기도 편하고 통파티션으로 설치된 리눅스에서 어디가 용량큰지 찾자고 계속 du 치고있ㅉ말자

Processor\%Processor Time : % Processor Time은 프로세서가 비유휴 스레드를 실행하는 데 소비하는 시간의 백분율입니다. 이것은 프로세서가 각 샘플 간격 동안 유휴 스레드를 실행하는 데 소비한 시간을 측정하여 간격 기간에서 그 값을 뺀 것입니다. 각 프로세서에는 유휴 스레드가 있는데 이것은 다른 어떤 스레드도 실행되지 않을 때 사이클을 소비하는 스레드입니다. 이 카운터는 프로세서 동작의 주요 표시기이며 샘플 간격 동안 관찰되는 사용 시간의 평균 백분율을 표시합니다. 이것은 서비스가 비활성인 시간을 모니터링하여 100%에서 그 값을 뺀 것입니다.


즉 쉽게 말해서, 1시간 동안 CPU상태를 관찰하였고, 1시간 중에서 30분간 CPU가 일을 하였다면, %Processor Time은 50% 입니다. 일반적으로 %Processor Time이 80%이상 사용되고 있으면, 관심을 가지고 사용량의 변화를 모니터하셔야 합니다.


Processor\%Privileged Time : % Privildged Time은 프로세스 스레드가 특권 모드에서 명령을 실행하면서 경과된 시간을 백분율로 표시한 것입니다. Windows 시스템 서비스가 호출되면, 서비스는 시스템 전용 데이터를 액세스하기 위해 흔히 특권 모드에서 실행됩니다. 그러한 데이터는 사용자 모드에서 실행되는 스레드가 액세스하지 못하도록 보호됩니다. 시스템 호출은 페이지 오류 또는 인터럽트가 발생할 때처럼 명시적이거나 암시적입니다. 일부 초기 운영 체제와는 달리 Windows는 사용자 및 특권 모드의 일반적인 보호뿐만 아니라 하위 시스템을 보호하기 위해 프로세스 경계를 사용합니다. 응용 프로그램을 대신하여 Windows에서 수행한 일부 작업은 프로세스의 특권 시간 및 다른 하위 시스템 프로세스에서도 나타납니다. 쉽게 말해서, 운영체제가 사용한 시간의 백분율 값입니다.


Memory\Available Bytes : Available Bytes는 컴퓨터에서 실행되는 프로세스에 사용할 수 있는 실제 메모리의 양(바이트)입니다. 이것은 0으로 채워 있거나 비어 있거나 대기 중인 메모리 목록에 있는 공간을 합해 계산합니다. 빈 메모리는 사용할 준비가 된 메모리이고, 0으로 채워진 메모리는 다음 프로세스가 이전 프로세스에서 사용된 데이터를 보지 못하도록 0으로 채운 메모리 페이지로 구성되며, 대기 메모리는 프로세스의 작업 집합(실제 메모리)에서 제거되어 디스크로 라우트되었지만 다시 호출되어 사용될 수 있는 메모리를 말합니다. 이 카운터는 최근에 관찰된 값만 표시하며 평균값은 아닙니다. 사용 가능한 여유 메모리는 많이 있으면 좋겠지만, 그렇지 않다면, 최소한 5Mbyte이상은 남아 있어야 합니다.


Memory\Page Faults/sec : Page Faults/sec는 프로세스가 사용하는 메모리 공간(Working Set)에 존재하지 않는 코드나, 데이터를 요청할 경우에 발생합니다. 이 때 요청된 코드나 데이터를 다른 메모리 공간에서 찾으면 Soft Page Fault라고 하며, 디스크에서 찾게되면 Hard Page Fault라고 합니다. Page Faults/sec은 초당 발생한 Soft Page Fault와 Hard Page Fault의 합입니다.

Soft Page Fault값은 Page Faults/sec값에서 Pages/sec값을 빼면 됩니다.


따라서,  Page Faults/sec의 값은 작을수록 좋다고 말 할 수 있겠으며, 상황에 따라서 그 임계치는 다르므로, 평상시에 모니터하여 적정 값을 파악해 두셔야 합니다. 


Memory\Pages/sec : Pages/sec는 하드 페이지 부재를 해결하기 위해 디스크에서 읽거나 디스크로 쓴 페이지의 비율입니다. 이것은 Memory\\Pages Input/sec과 Memory\\Pages Output/sec의 합입니다. 메모리 공간이 부족하게 되면, 디스크의 페이징 파일로 메모리의 내용을 옮겨서 메모리의 여유공간을 확보하여 사용하게 되며, 또 필요 시 페이징 파일에서 데이터를 메모리로 로드하여 처리하는 과정을 반복하게 되므로 성능이 저하되게 됩니다. 


Pages/sec 카운터 값이 20이상 지속되면 메모리 이상을 의심해야 합니다.


PhysicalDisk\%Disk Read Time : 디스크가 읽기 작업을 수행한 시간의 백분율입니다.


PhysicalDisk\%Disk Write Time : 디스크가 쓰기 작업을 수행한 시간의 백분율입니다.


PhysicalDisk\%Disk Time : 디스크가 읽기 및 쓰기 작업을 수행한 시간의 백분율이며, 이 값은 Disk Read Time과 Disk Write Time의 합입니다.


PhysicalDisk\Avg. Disk Queue Length : 디스크의 읽기 및 쓰기 작업을 위해 대기중인 실제 디스크 큐 길이 입니다. 이 값은 디스크당 2를 초과하게 되면, 디스크 쪽 부하를 점검해야 합니다.


PhysicalDisk\Current Disk Queue Length : 현재 시점의 디스크 읽기 및 쓰기 작업을 위해 대기중인 디스크 큐 길이 입니다. 이 값 역시 2를 초과하면, 디스크 쪽 부하를 점검해야 합니다.


Network Interface\Current Bandwidth : 네트워크 인터페이스의 현재 대역폭입니다. 사용하는 네트워크 어댑터 카드의 지원 가능 대역이 100Mbps인 경우에 Current Bandwidth값이 10Mbps라면 네트워크 어댑터 카드의 속성 세팅이 잘못 되었을 가능성이 큽니다.


Network Interface\Packets Outbound Errors : 이 항목은 오류로 인해서 외부로 반출할 수 없는 패킷의 수를 나타냅니다.


Network Interface\Packets Received Errors : 이 항목은 상위 계층의 프로토콜로 전달되지 못하도록 하는 오류를 포함하고 있는 외부로부터 유입되는 패킷의 수를 나타냅니다.


Server\Bytes Total/sec : 이 항목은 초당 서버가 네트워크에서 주고 받은 바이트 수 입니다. 동일 네트워크에 존재하는 서버들의 각각의 Bytes Total/sec 합이 네트워크 대역폭보다 크다면, 네트워크 분리를 고려하셔야 합니다.


SQLServer:Buffer Manager\Buffer cache hit ratio : SQL서버가 데이터를 디스크에서 읽지 않고 버퍼 풀에서 찾은 페이지 비율입니다. 이 값은 90% 이상 유지되어야 하며, 대부분의 시스템에서  98% 정도 유지 됩니다. 이 값이 90보다 낮다면 버퍼 공간이 부족하다고 판단할 수 있습니다.


SQLServer:Buffer Manager\Page life expectancy : 이 항목은 페이지가 참조되지 않고 얼마나 오랫동안 버퍼에 존재할 수 있는가를 초 단위로 나타냅니다. 이 값이 300초 이하이면, 성능향상을 위해  SQL서버에 추가적인 버퍼 공간이 필요하다고 볼 수 있습니다.


SQLServer:Buffer Manager\Page reads/sec : 모든 데이터베이스에 대해서 발생한 물리적 데이터 페이지의 초당 읽기 수를 나타냅니다. 물리적 I/O는 상대적으로 비용이 많이 발생하므로, 더 큰 데이터 캐시를 사용하거나, 인덱스 및 쿼리를 효율적으로 작성하거나, 데이터베이스 모델링을 다시하여 물리적 I/O비용을 줄여야 합니다.


SQLServer:Buffer Manager\Stolen Page : 윈도우 시스템이 SQL서버가 아닌 다른 응용 프로그램의 요구를 충족시키기 위하여 얼마나 많은 페이지들이 SQL Server 데이터 캐시로부터 제거되었는지를 나타낸다. min Server memory를 지정하여 SQL서버가 지정한 만큼의 SQL서버 전용으로 메모리를 할당하게 할 수 있지만, 그 만큼 다른 프로그램이 적은 메모리로 운영되게 되므로 페이징이 발생하게 됩니다. 따라서 메모리 증설을 고려해야 합니다.


SQLServer:Databases\Log Flushes/sec : 초당 발생한 로그 플러시 수를 나타냅니다. 하나의 로그플러시는 하나의 트랜잭션이 커밋되어 로그 파일에 기록되는 것을 의미 합니다.


SQLServer:Databases\Transactions/sec : 선택한 데이터 베이스에서 발생한 초당 발생하는 트랜잭션 수를 나타냅니다. 


SQLServer:General Statistics\User Connections : 시스템에 연결된 사용자 수를 나타냅니다.


SQL Server:Latches\Average Latch Wait Time(ms) : 요청된 래치에 대한 평균 래치 대기 시간(ms)


SQL Server:Latches\Latch Waits/sec : 즉시 서비스 될 수 없고 자원 해제를 위해 대기해야 하는 래치 요청 수


SQL Server: Locks\Average Wait Time(ms) : 리소스에 잠금을 걸기 위해  대기하였던 평균 시간(ms)을 나타냅니다.


SQL Server: Locks\Lock Timeouts/sec : 리소스에 잠금을 얻기 위해 대기하면서 타임 아웃된 잠금 요청 횟수를 나타냅니다.


SQL Server: Locks\Lock Waits/sec : 즉시 충족시킬 수 없고 잠금을 허가하기 위해서 호출자가 기다려야 하는 잠금 요청 수 


SQL Server: Locks\Number of Deadlocks/sec : 교착 상태를 일으킨 잠금 요청 수


SQL Server: Memory Manager\Memory Grants Pending : 작업 영역 메모리 허가를 위해 대기하고 있는 현재의 프로세스 수


SQL Server: Memory Manager\Target Server Memory(KB) : SQL Server가 사용할 수 있는 전체 메모리 양


SQL Server: Memory Manager\Total Server Memory(KB) : SQL Server가 사용하고 있는 전체 메모리 양


SQL Server: SQL Statistics\Batch Requests/sec : 초당 요청 받은 SQL 배치 요청 수


SQL Server: SQL Statistics\SQL Compilations/sec : 초당 SQL Server가 SQL문을 컴파일 한 수

 

 

SQL Server: SQL Statistics\Re-Compilations/sec : 초당 SQL Server가 SQL문을 재 컴파일 한 수





출처

http://sqler.pe.kr/web_board/view_list.asp?id=919&read=8898&pagec=17&gotopage=17&block=1&part=myboard7&tip=

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

모니터링시 조치 방법  (0) 2018.08.31
병목현상 점검 조치  (0) 2018.08.31

출처 : http://tiger5net.egloos.com/5096569


분류항목임계값대처방법
MemoryAvailable Mbytes5MB 이하 (최소값)* 사용 가능한 물리적 메모리 용량
- Memory 20~25%보다 작은 값이 측정된다면, 특정 프로세스가 메모리누수를 발생시키고 있으므로 프로세스를 확인하거나 메모리증설
Page Faults/sec20* 초당 Page Fault 수
- 20이상이 되면 서버가 불안정
- 특히, 메모리 불량이거나 패리티에러가 발생하면 수치가 높아짐
- 웹서버는 보통 80~200은 정상으로 판단
Pages/sec20이상 : 경고
30이상 : 위험
* 초당 페이징 수
- SQL서버
1) Buffer Cache Hit Ratio도 이상이 있는 경우
    메모리증설 필요

2) Buffer Cache Hit Ratio에 이상이 없는 경우
    다른 Application의 영향 유무파악
    SQL서버 메모리구성 설정변경 (동적->고정)
- 일반서버
   Available Mbytes가 정상인데 임계치를 넘는 경우는 
   다른 Application에서 메모리관리를 잘못하는 경우임.
Pool Nonpaged 
Bytes
비정상 증가* 메모리 중 non-paged pool의 크기
- 유휴상태에서 해당값이 비정상적으로 증가한다면 
메모리누수
PhysicalDisk% Disk Time50%이상 : 경고
60%이상 : 위험
* Disk IO 사용율
- 임계치면 IO 과부하가 예상
- 논리파티션이나 개별 Disk의 값이 아닌 Disk Array 
전체의 값
Array증설 필요
Avg. Disk 
Queue Length
2이상* Disk 대기열에 있는 IO요청 평균 수
- Array인 경우 임계치 산정은 Disk수 * 2
Disk교체 or Array 구성이 아닐 경우 Array 구성
Processor% Processor Time70%이상 : 경고
80%이상 : 위험
* CPU 사용율
- 시스템에 의한 사용율 + 사용자에 의한 사용율
Interrupts/sec비정상 증가* 초당 인터럽트 횟수
- 네트웍카드와 같은 하드웨어에 문제가 생길 경우
  급증
ServerBytes Total/sec네트웍카드
최대 전송률
* 초당 전송바이트 수
- 장착된 네트웍카드의 최대 전송률과 비슷해지면 고  성능의 네트웍카드나 추가의 네트웍카드의 장착이 
필요
Pool Paged Peak물리적 메모리양* paged pool로 잡혔던 최대크기
- 해당값이 높다면 Application이 busy상태임.
- 메모리의 과부하로 이어지기 때문에 응용코드의 
  수정필요
Server Work
Queues
Queue Length4이상* CPU의 현재 작업큐의 길이
- 임계치 이상이면 CPU에 병목이 발생중임.
SQL Server:
Buffer Manager
Buffer cache 
hit ratio
90%이하* 메모리 접근 시 Disk가 아닌 Buffer를 사용하는 비율
- sqlserver.exe 프로세스의 메모리 사용을 체크하는 
  기준
메모리증설 필요
SQL Server:
General Statistics
User Connections255이상* DB Connection 수
- DB connection count >= SQL서버 max worker thread일 때, Connection당 1개씩의 worker thread
가 할당되어 가장 좋음
- 임계치 이상일 경우 "max worker threads" 
설정값을 늘림.
SystemProcessor Queue 
Length
2이상* CPU연산을 하기위한 Thread 대기 수
- 임계치 산정은 CPU수 * 2
- SQL서버
  1) CPU사용율이 낮으나 임계치를 벗어난 경우
      SQL서버의 "max worker threads" 설정값을 줄임.
  2) CPU사용율이 높거나 #1의 경우로 미해결인 경우
      CPU증설
or thread수를 줄일 방법모색
- 일반서버
  1) 
CPU증설 or thread수를 줄일 방법모색
* 임계치 초과가 10분이상 지속된다면 H/W의 증설을 검토해야 함.


참고자료1 : SQL서버 진단을 위한 주요 성능카운터

참고자료2 : 서버 성능 평가
 

측정 대상 및 시기
리소스가 한도에 도달할 경우 전체 시스템 성능이 느려질 수 있는 병목 현상이 발생합니다. 병목 현상은 대체로 리소스 부족이나 잘못된 구성, 구성 요소 오작동 및 리소스에 대한 프로그램의 잘못된 요청 등으로 인해 발생합니다. 
 
병목 현상을 유발하고 서버 성능에 영향을 줄 수 있는 주요 리소스 영역은 물리적 디스크, 메모리, 프로세스, CPU, 네트워크 등의 5가지입니다. 이러한 리소스가 과도하게 사용되면 서버 또는 응용 프로그램이 현저하게 느려지거나 충돌이 발생할 수 있습니다. 이 문서에서는 이러한 5가지의 각 영역에서 사용해야 하는 카운터에 대해 소개하고 서버의 상태를 측정하는 데 권장되는 임계값을 제공합니다.
 
샘플링 간격은 로그 파일의 크기 및 서버 부하에 많은 영향을 주므로, 문제가 다시 발생하기 전에 기준을 설정할 수 있도록 문제가 발생하는 데 걸리는 평균 기간을 기준으로 샘플 간격을 설정해야 합니다. 그러면 문제로 이어지는 경향을 파악할 수 있습니다.
일반적인 작업 중 기준을 설정하기 위한 권장 시간은 15분입니다. 문제가 발생하는 데 걸리는 평균 시간이 약 4시간이라면 샘플 간격을 15초로 설정합니다. 문제가 발생하는 데 걸리는 시간이 8시간 이상이라면 샘플링 간격을 5분 이상으로 설정합니다. 그렇지 않으면 로그 파일이 너무 커져서 데이터를 분석하는 데 어려울 수 있습니다.


하드 디스크 병목 현상
디스크 시스템은 서버에서 프로그램 및 데이터를 저장하고 처리하므로 디스크 사용량 및 속도에 영향을 미치는 병목 현상은 서버의 전체적인 성능에 큰 영향을 줍니다. 
 
디스크 개체가 서버에서 비활성화된 경우 명령줄 도구 Diskperf를 통해 활성화해야 합니다. 또한 % Disk Time은 100%를 초과할 수 있으므로 대신 % Idle Time, Avg. Disk sec/Read 및 Avg. Disk sec/write를 사용하면 하드 디스크가 얼마나 많이 사용되고 있는지 좀더 정확하게 파악할 수 있습니다. % Disk Time에 대한 자세한 내용은 support.microsoft.com/kb/310067 기술 자료 문서를 참조하십시오. 
 
다음은 Microsoft Service Support 엔지니어가 디스크 모니터링을 위해 사용하는 카운터입니다.
 
LogicalDisk\% Free Space 선택한 논리 디스크 드라이브에서 사용할 수 있는 공간의 백분율을 측정합니다. 이 카운터가 15% 아래로 떨어지면 OS에서 중요 파일을 저장하기 위한 여유 공간이 부족할 수 있습니다. 이 경우 확실한 해결책은 디스크 공간을 늘리는 것입니다.
 
PhysicalDisk\% Idle Time 샘플 간격 중 디스크가 유휴 상태였던 시간 백분율을 측정합니다. 이 카운터가 20% 아래로 떨어지면 디스크 시스템이 포화 상태인 것입니다. 현재 디스크 시스템을 더 빠른 디스크 시스템으로 교체하는 것이 좋습니다.
 
PhysicalDisk\Avg. Disk Sec/Read 디스크에서 데이터를 읽는 데 걸리는 평균 시간(초)을 측정합니다. 값이 25ms(밀리초)보다 크면 디스크에서 읽을 때 디스크 시스템에 지연 현상이 발생하고 있음을 의미합니다. SQL Server® 및 Exchange Server를 호스팅하는 중요 업무 서버의 경우 허용 가능한 임계값은 10ms 미만입니다. 여기에서 가장 현명한 해결책은 현재 디스크 시스템을 더 빠른 디스크 시스템으로 교체하는 것입니다.
 
PhysicalDisk\Avg. Disk Sec/Write 디스크에 데이터를 쓰는 데 걸리는 평균 시간을 측정합니다. 이 시간이 25ms보다 크면 디스크에 쓸 때 디스크 시스템에 지연 현상이 발생하고 있음을 의미합니다. SQL Server 및 Exchange Server를 호스팅하는 중요 업무 서버의 경우 허용 가능한 임계값은 10ms 미만입니다. 여기에서 현명한 해결책은 디스크 시스템을 더 빠른 디스크 시스템으로 교체하는 것입니다.
 
PhysicalDisk\Avg. Disk Queue Length 얼마나 많은 I/O 작업이 하드 드라이브를 사용할 수 있을 때까지 대기하고 있는지 나타냅니다. 여기에서 값이 스핀들 수 + 2보다 크면 디스크 자체에 병목 현상이 있음을 의미합니다.
 
Memory\Cache Bytes 파일 시스템 캐시에 사용되고 있는 메모리의 양을 나타냅니다. 이 값이 200MB보다 크면 디스크 병목 현상이 발생할 수 있습니다.


메모리 병목 현상
메모리 부족은 대체로 RAM 부족, 메모리 누수 또는 boot.ini의 메모리 스위치 등으로 인해 발생합니다. 메모리 카운터를 소개하기 전에 먼저 /3GB 스위치에 대해 설명하겠습니다.
 
메모리가 많을수록 디스크 I/O 작업이 줄고 응용 프로그램 성능이 높아집니다. /3GB 스위치는 사용자 모드 프로그램에 더 많은 메모리를 제공하기 위한 방법으로 Windows NT®에서 도입되었습니다. 
 
Windows에서는 4GB의 가상 주소 공간을 사용하며 이는 시스템의 물리적 RAM과는 무관합니다. 기본적으로 하위 2GB는 사용자 모드 프로그램을 위해 사용되고, 상위 2GB는 커널 모드 프로그램을 위해 사용됩니다. /3GB 스위치를 사용하면 사용자 모드 프로세스에 3GB가 제공됩니다. 그러면 물론 커널 메모리가 가상 주소 공간의 1GB만 남게 되므로 영향을 받습니다. 이 경우 페이징되지 않은 바이트 풀링, 페이징된 바이트 풀링, 사용 가능한 시스템 페이지 테이블 항목 및 데스크톱 힙이 모두 이 1GB 공간 안에 들어가야 하므로 문제가 발생할 수 있습니다. 따라서 /3GB 스위치는 해당 환경에서 충분한 테스트를 거친 후에만 사용해야 합니다. 
 
메모리 관련 병목 현상이 발생하는 경우 이 스위치를 의심해 볼 수 있습니다. /3GB 스위치가 문제의 원인이 아니라면 다음 카운터를 사용하여 잠재적인 메모리 병목 현상을 진단할 수 있습니다.
 
Memory\% Committed Bytes in Use 커밋된 바이트와 커밋 한도의 비율, 즉 가상 메모리의 사용량을 측정합니다. 이 값이 80%보다 크면 메모리가 부족함을 나타냅니다. 이 경우 확실한 해결책은 메모리를 추가하는 것입니다. 
 
Memory\% Available Mbytes 프로세스 실행을 위해 사용할 수 있는 실제 메모리의 양(메가바이트)을 측정합니다. 이 값이 총 물리적 RAM의 5%보다 작으면 메모리가 부족함을 나타내며 이로 인해 페이징 작업이 늘어날 수 있습니다. 이 문제를 해결하려면 메모리를 추가해야 합니다. 

Memory\Free System Page Table Entries 
시스템에서 현재 사용되지 않는 페이지 테이블 항목의 수를 나타냅니다. 이 숫자가 5,000보다 작으면 메모리 누수가 있을 수 있습니다. 
Memory\Pool Non-Paged Bytes 페이징되지 않은 풀의 크기(바이트)를 측정합니다. 디스크에 쓸 수 없고 대신 실제 메모리에 남아 있어야 하는 할당된 개체에 대한 시스템 메모리 영역입니다. 이 값이 175MB(또는 /3GB 스위치의 경우 100MB)보다 크면 메모리 누수 가능성이 있습니다. 일반적인 이벤트 ID 2019가 시스템 이벤트 로그에 기록됩니다.
 
Memory\Pool Paged Bytes 페이징된 풀의 크기(바이트)를 측정합니다. 사용되고 있지 않을 때 디스크에 쓸 수 있는 개체에 대한 시스템 메모리 영역입니다. 이 값이 250MB(또는 /3GB 스위치의 경우 170MB)보다 크면 메모리 누수 가능성이 있습니다. 일반적인 이벤트 ID 2020이 시스템 이벤트 로그에 기록됩니다.
 
Memory\Pages per Second 하드 페이지 결함을 해결하기 위해 디스크에서 페이지를 읽거나 쓰는 속도를 측정합니다. 과도한 페이징으로 인해 이 값이 1,000보다 크면 메모리 누수 가능성이 있습니다.


프로세서 병목 현상
프로세서 병목 현상은 프로세서 자체의 성능이 나빠서 발생하거나 비효율적인 응용 프로그램으로 인해 발생할 수 있습니다. 실제 메모리 부족으로 인해 프로세서가 페이징에서 많은 시간을 보내지 않는지 다시 확인해야 합니다. 잠재적인 프로세서 병목 현상을 조사할 때 Microsoft Service Support 엔지니어는 다음 카운터를 사용합니다. 
 
Processor\% Processor Time 프로세서가 비유휴 스레드 실행에 소비하는 경과 시간의 백분율을 측정합니다. 이 백분율이 85%보다 크면 프로세서에 병목 현상이 발생하고 서버에 더 빠른 프로세서가 필요할 수 있습니다. 
 
Processor\% User Time 프로세서가 사용자 모드에서 소비하는 경과 시간의 백분율을 측정합니다. 이 값이 높으면 서버에서 응용 프로그램이 많이 실행되고 있음을 나타냅니다. 한 가지 가능한 해결책은 프로세서 리소스를 많이 사용하는 응용 프로그램을 최적화하는 것입니다.
 
Processor\% Interrupt Time 지정된 샘플 간격 중 프로세서가 하드웨어 인터럽트 수신 및 서비스 제공에 소비하는 시간을 측정합니다. 이 값이 15%보다 크면 하드웨어 문제일 수 있습니다.
 
System\Processor Queue Length 프로세서 큐의 스레드 수를 나타냅니다. 이 값이 일정 기간 동안 CPU 수 x 2보다 크면 서버에 프로세서 성능이 부족한 것입니다.


네트워크 병목 현상
네트워크 병목 현상은 네트워크에서 데이터를 송수신하는 서버의 성능에 영향을 미칩니다. 서버의 네트워크 카드에 문제가 있을 수 있거나, 네트워크가 포화 상태여서 분할해야 할 수 있습니다. 다음 카운터를 사용하여 잠재적인 네트워크 병목 현상을 진단할 수 있습니다.
 
Network Interface\Bytes Total/Sec 프레이밍 문자를 포함하여 각 네트워크 어댑터를 통해 보내고 받는 바이트의 비율을 측정합니다. 인터페이스의 70% 이상이 사용되면 네트워크가 포화 상태입니다. 100Mbps NIC의 경우 사용되는 인터페이스는 8.7MB/초입니다(100Mbps = 100000kbps = 12.5MB/초* 70%). 이와 같이 포화 상태이면 더 빠른 네트워크 카드를 추가하거나 네트워크를 분할해야 할 수 있습니다.
 
Network Interface\Output Queue Length 출력 패킷 큐의 길이(패킷)를 측정합니다. 이 값이 2보다 크면 네트워크가 포화 상태입니다. 이 문제는 더 빠른 네트워크 카드를 추가하거나 네트워크를 분할하여 해결할 수 있습니다.


프로세스 병목 현상
제대로 작동하지 않는 프로세스나 최적화되지 않은 프로세스가 있으면 서버 성능이 크게 저하될 수 있습니다. 스레드 및 핸들 누수는 결국 서버 다운으로 이어지고, 과도한 프로세서 사용은 서버 속도를 저하시킵니다. 다음 카운터는 프로세스 관련 병목 현상을 진단할 때 유용합니다.
 
Process\Handle Count 프로세스로 현재 열린 총 핸들 수를 측정합니다. 이 값이 10,000보다 크면 핸들 누수 가능성이 있습니다. 
 
Process\Thread Count 프로세스에서 현재 활성 스레드 수를 측정합니다. 이 값이 최소 및 최대 스레드 수 사이에서 500보다 크면 스레드 누수 가능성이 있습니다. 
 
Process\Private Bytes 다른 프로세스와 공유할 수 없는 이 프로세스에 할당된 메모리의 양입니다. 이 값이 최소 및 최대 스레드 수 사이에서 250보다 크면 메모리 누수 가능성이 있습니다.


요약
지금까지 Microsoft의 Service Support 엔지니어가 다양한 병목 현상을 진단하기 위해 사용하는 카운터를 살펴보았습니다. 물론 결국에는 자신의 특정 요구에 맞는 고유의 카운터를 사용해야 합니다. 또한 서버를 모니터링해야 할 때마다 모든 카운터를 수동으로 추가할 필요가 없게 해야 합니다. 다행히 성능 모니터에는 나중에 사용하기 위해 템플릿에 모든 카운터를 저장할 수 있는 옵션이 있습니다. 
 
성능 모니터를 로컬에서 실행해야 하는지 아니면 원격으로 실행해야 하는지 결정하지 못할 수 있습니다. 또한 성능 모니터를 로컬에서 실행할 때 성능에 정확히 어떤 영향을 주는지도 확실하지 않을 경우가 있습니다. 이 모든 사항은 특정 환경에 따라 다릅니다. 간격을 5분 이상으로 설정한다면 서버에서의 성능 저하는 거의 무시할 만한 수준입니다. 
 

성능 모니터는 서버에 리소스가 부족할 때 원격 시스템에서 데이터를 가져오지 못할 수 있으므로 서버에 성능 문제가 있음을 알고 있다면 성능 모니터를 로컬에서 실행하는 것이 좋습니다. 중앙 컴퓨터에서 원격으로 실행하는 것은 여러 서버를 모니터링하거나 기준으로 사용하고자 할 때 가장 이상적입니다. 

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

mssql 튜닝을위한 성능 모니터  (0) 2018.08.31
병목현상 점검 조치  (0) 2018.08.31

공인된 인증서를 가지고 있으면 openssl을 통하여 PKCS #12 형식으로 변환하여 톰캣에 적용시킬 수 있음. 

자체적으로 인증서를 생성할경우에는 복잡함. 


ssl.key : 개인키 

ssl.crt : 인증서 

InstantSSL.ca-bundle : 중개자인증서 


0. PKCS #12 형식으로 변환(톰캣에서 인식할수 있게 변환하는 것임) 

openssl pkcs12 -export -in ssl.crt -inkey ssl.key -certfile InstantSSL.ca-bundle -out ssl.p12 -name tomcat 


1. tomcat 5.5 경우 (server.xml) 

<Connector port="8443" 

              maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 

              enableLookups="false" disableUploadTimeout="true" 

              acceptCount="100" debug="0" scheme="https" secure="true" 

              keystoreFile="/경로/client.p12" keystorePass="패스워드" 

              keystoreType="pkcs12" 

              clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601" /> 


2. tomcat 6 경우 (server.xml) 

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" /> 

<Connector protocol="org.apache.coyote.http11.Http11Protocol" 

                  port="8443" minSpareThreads="5" maxSpareThreads="75" 

                  enableLookups="true" disableUploadTimeout="true" 

                  acceptCount="100" maxThreads="200" 

                  scheme="https" secure="true" SSLEnabled="true" 

                  keystoreFile="/경로/client2.p12" keystorePass="패스워드" 

                  keystoreType="pkcs12" 

                  clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601"/> 



=================================================================================================== 


[자체적으로 인증서 생성시 SSL 적용방법] 


touch index.txt 

echo "0001" > serial 

echo "0001" > crlnumber 

vi /etc/pki/tls/openssl.cnf 

dir            = .            # Where everything is kept  <-----요부분 . 으로 수정하면 됨. 

certs          = $dir/certs            # Where the issued certs are kept 

crl_dir        = $dir/crl              # Where the issued crl are kept 

database        = $dir/index.txt        # database index file. 


1. CA 및 서버 인증서 생성 


- 자체인증기관 생성 

openssl genrsa -des3 -out ./private/cakey.pem 2048 


openssl req -new -x509 -days 3650 -key ./private/cakey.pem -out ./cacert.pem 


- key 생성 

openssl genrsa -des3 -out certificate-key.pem 1024 


- 인증기관(자체) 보낼 요청 생성 

openssl req -new -days 3650 -key certificate-key.pem -out certificate-req.pem 


- 인증기관(자체) 인증 

openssl ca -in certificate-req.pem -out certificate.pem -notext 


- 톰켓용 변환 

openssl pkcs12 -export -in certificate.pem -inkey certificate-key.pem -certfile ./cacert.pem -out client.p12 -name tomcat 


2. server.xml 설정 

 - Tomcat 5.5 경우      

 <Service name="Catalina"> 

    <Connector port="8443" 

              maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 

              enableLookups="false" disableUploadTimeout="true" 

              acceptCount="100" debug="0" scheme="https" secure="true" 

              keystoreFile="/root/demoCA/client.p12" keystorePass="*******" 

              keystoreType="pkcs12" 

              clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601" /> 

        <Engine name="Catalina" defaultHost="localhost" debug="0"> 

          <Realm className="org.apache.catalina.realm.UserDatabaseRealm" debug="0" 

                      resourceName="UserDatabase"/> 

          <Host name="localhost" appBase="webapps"> 

              <Context path="/contextName" docBase="/home/altimis/tomcat/webapps/test" 

                                                  reloadable="true"/> 

      </Host> 

    </Engine> 

  </Service> 

  

  

- Tomcat 6 경우      

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" /> 

  

<Connector protocol="org.apache.coyote.http11.Http11Protocol" 

                  port="8443" minSpareThreads="5" maxSpareThreads="75" 

                  enableLookups="true" disableUploadTimeout="true" 

                  acceptCount="100" maxThreads="200" 

                  scheme="https" secure="true" SSLEnabled="true" 

                  keystoreFile="/root/demoCA/client.p12" keystorePass="******" 

                  keystoreType="pkcs12" 

                  clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601"/>

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

java 메모리 분석  (0) 2018.08.31

sed '/\#/d' httpd-ssl.conf


#이 포함된 경우 해당 줄 삭제


요거는 


if $a=1 ## 설명 




이런식으로 뒤쪽에 설명이 붙은것도 삭제되기때문에 아래와같이 쓴다






sed '/^\#/d' httpd-ssl.conf


맨 앞에 글자(행의 시작)이 #인 경수 해당 줄 삭제

dig 도메인 +tracert




하면 어디서 오래 걸리는지 알 수 있다.




시간이 5초 10초 이런식으로 5초 간격으로해서 오래 걸리는거면 


##


/usr/include/resolv.h 파일 열어보셔서 




# define RES_TIMEOUT  몇으로 설정되어 있는지 확인해 보셔요


###



 


거의 99프로는 네임서버 문제니까




구글이든 sk든 kt든 등등 어디든 다른곳으로 1순위를 바꾸고 테스트 해보면 됨










추천 설정 


options timeout:1 attempts:3 rotate


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

call trace 에러  (0) 2018.08.31
kill PID 여러개 한번에 죽이기  (0) 2018.08.31
히스토리, 명령어 저장등 script  (0) 2018.08.31
centos 6 xtables 설치시 에러  (0) 2018.08.31
nginx-php 연동 php-fpm fpm nginx php 연동  (0) 2018.08.31

kill -9 `ps -ef | grep 삭제할프로세스 | grep -v 'grep' | awk '{print $2}'`


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

ncdu 명령어  (0) 2018.08.31
sed '/^\#/d' 파일 > 파일_주석제거된거  (0) 2018.08.31
tee 명령어  (0) 2018.08.31
리눅스 파일 엔터표시(^M) 없애기  (0) 2018.08.31
grep 색깔 표시  (0) 2018.08.31

리눅스 centos 




tee 명령어




화면 출력과 텍스트 저장을 동시에 하는 명령어




ex)




[root@localhost ~]# free | tee free.txt


             total       used       free     shared    buffers     cached


Mem:       2048132    2036888      11244          0      10640    1783308


-/+ buffers/cache:     242940    1805192


Swap:      1959920     183760    1776160


[root@localhost ~]# cat free.txt 


             total       used       free     shared    buffers     cached


Mem:       2048132    2036888      11244          0      10640    1783308


-/+ buffers/cache:     242940    1805192


Swap:      1959920     183760    1776160








tee 명령어는 로그 저장용? 이라고 생각하면 편하다.




예를들어




make | tee make.txt 라던가




좀 오바한다 싶으면 작업 디렉토리 들어가서 




무슨 명령어를 치든


명령어 | tee 명령어$$.txt




이런식으로 쳐놓으면 내가 입력했던 명령어의 결과들이 전부 저장되니까




커널을 수정하거나 아니면 bashrc 수정(가능한가?)하거나 잘은 모르겠는데 무슨 방법을 쓰면(알아봐야겠다)




작업 디렉토리 하나 생성되고 거기에 자동으로 굳이 tee 명령어 입력을 안해도 tee 명령어`date`.txt 를 만들도록 해놓으면 괜찮을지도 ?

(vi나 crontab 같은 에디터는 뭔가 꼬일듯 하니 제외시키고)

서버 root 홈디렉토리에 .log_history 디렉토리 생성




.bash_profile 에 아래 내용추가






export PS1="\`echo -en \| \\# \|$(tty)\|\t\| >> $HOME/.log_history/history_$(date '+%y%m%d')




echo -en $(date '+%y%m%d')\|$SSH_CLIENT\| >> $HOME/.log_history/history_$(date '+%y%m%d')






history |tail -n 1 >> $HOME/.log_history/history_$(date '+%y%m%d')




echo '[\u@\h \W]\\$ '\`"










그러면 히스토리 확실하게 남길 수 있음






그다음 /etc/profile 에 






NOW=$(date +%Y-%m-%d-%H:%M)


mkdir -p /root/.log_history/$NOW




TTY=`echo $(tty) | awk -F / '{print $3$4}'`


script -q /root/.log_history/$NOW/$TTY




이거 넣어두면 




/root/.log_history/%TTY 에 그사람(pts0,1등등)이 입력했던 명령어, 그 명령어의 결과값까지 저장됨




근데...script 명령어가 완전 실시간이 아니라 한 10초정도 뒤에 입력되는듯 ? exit 명령어를 넣어주면 전부 저장이 되는데 씨큐어,푸티를 종료하는등의 세션을 그냥 꺼버리면 마지막 10초정도는 저장이 안되는듯

-rw-r--r--  1 root root   2174 Nov 10  2015 install.sh^M


drwxr-xr-x  2 root root   4096 Jan 11 12:56 ^[[01;34mmonitor^[[0m^M


drwxr-xr-x  4 root root   4096 Nov 17 11:42 ^[[01;34mreboot^[[0m^M


-rw-r--r--  1 root root    633 Nov  1 11:13 reboot.sh^M


-rw-r--r--  1 root root    643 Nov 17 11:05 reboot.sh.1^M






위처럼




script 명령어로 파일 저장하고 vi로 열어보면 마지막 ^M 엔터표시 있다.




script 명령어 아니여도 윈도우에서 파일 저장한거 리눅스에서 연다던지 하면 저런 ^M 표시 있을수있다.




저거 지우는 명령어는




perl -p -i -e "s/\r//g" filename

root@localhost:/opt/mysql/scripts# ./mysql_install_db --base-dir=/opt/mysql --datadir=/opt/mysql/data




FATAL ERROR: Could not find ./bin/my_print_defaults




If you compiled from source, you need to run 'make install' to


copy the software into the correct location ready for operation.




If you are using a binary release, you must either be at the top


level of the extracted archive, or pass the --basedir option


pointing to that location.






FATAL ERROR: Could not find ./bin/my_print_defaults


위 에러 처럼 경로를 제대로 못찾고있다.


해결은


vi로 ./mysql_install_db 열어서


 21 basedir="/opt/mysql"

 22 builddir=""

 23 ldata="/opt/mysql/data"



위 라인에 직접 basedir ldata 에 직접 경로 넣어주고


./mysql_install_db


위에처럼 basedir 이나 datadir 옵션 주지말고 그냥 실행하면됨

~/script/xtables-addons-2.0]# make -j 8

make  all-recursive

make[1]: Entering directory `/root/script/xtables-addons-2.0'

Making all in extensions

make[2]: Entering directory `/root/script/xtables-addons-2.0/extensions'

make -f ../Makefile.iptrules all;

Xtables-addons 2.0 - Linux make[3]: Entering directory `/root/script/xtables-addons-2.0/extensions'

  CC     libxt_geoip.oo

  CCLD   libxt_geoip.so

make[3]: Leaving directory `/root/script/xtables-addons-2.0/extensions'

2.6.32-642.6.2.el6.x86_64

if [ -n "/lib/modules/2.6.32-642.6.2.el6.x86_64/build" ]; then make -C /lib/modules/2.6.32-642.6.2.el6.x86_64/build M=/root/script/xtables-addons-2.0/extensions modules; fi;

make[3]: Entering directory `/usr/src/kernels/2.6.32-642.6.2.el6.x86_64'

  CC [M]  /root/script/xtables-addons-2.0/extensions/compat_xtables.o

  CC [M]  /root/script/xtables-addons-2.0/extensions/xt_geoip.o

In file included from /root/script/xtables-addons-2.0/extensions/compat_xtables.h:7,

                 from /root/script/xtables-addons-2.0/extensions/xt_geoip.c:25:

/root/script/xtables-addons-2.0/extensions/compat_xtnu.h:21: warning: 'struct xt_action_param' declared inside parameter list

/root/script/xtables-addons-2.0/extensions/compat_xtnu.h:21: warning: its scope is only this definition or declaration, which is probably not what you want

/root/script/xtables-addons-2.0/extensions/compat_xtnu.h:36: warning: 'struct xt_action_param' declared inside parameter list

In file included from /root/script/xtables-addons-2.0/extensions/xt_geoip.c:25:

/root/script/xtables-addons-2.0/extensions/compat_xtables.h:12:3: warning: #warning Kernels below 3.7 not supported.

In file included from /root/script/xtables-addons-2.0/extensions/compat_xtables.c:26:

/root/script/xtables-addons-2.0/extensions/compat_xtnu.h:21: warning: 'struct xt_action_param' declared inside parameter list

/root/script/xtables-addons-2.0/extensions/compat_xtnu.h:21: warning: its scope is only this definition or declaration, which is probably not what you want

/root/script/xtables-addons-2.0/extensions/compat_xtnu.h:36: warning: 'struct xt_action_param' declared inside parameter list

/root/script/xtables-addons-2.0/extensions/compat_xtables.c:32: warning: 'struct xt_action_param' declared inside parameter list

/root/script/xtables-addons-2.0/extensions/compat_xtables.c: In function 'xtnu_target_run':

/root/script/xtables-addons-2.0/extensions/compat_xtables.c:34: error: dereferencing pointer to incomplete type

/root/script/xtables-addons-2.0/extensions/compat_xtables.c:36: warning: passing argument 2 of 'nt->target' from incompatible pointer type

/root/script/xtables-addons-2.0/extensions/compat_xtables.c:36: note: expected 'const struct xt_action_param *' but argument is of type 'const struct xt_action_param *'

/root/script/xtables-addons-2.0/extensions/compat_xtables.c: In function 'xtnu_register_target':

/root/script/xtables-addons-2.0/extensions/compat_xtables.c:60: warning: assignment from incompatible pointer type

/root/script/xtables-addons-2.0/extensions/compat_xtables.c:61: warning: assignment from incompatible pointer type

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:190: warning: 'struct xt_action_param' declared inside parameter list

/root/script/xtables-addons-2.0/extensions/xt_geoip.c: In function 'xt_geoip_mt6':

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:192: error: dereferencing pointer to incomplete type

/root/script/xtables-addons-2.0/extensions/xt_geoip.c: At top level:

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:244: warning: 'struct xt_action_param' declared inside parameter list

/root/script/xtables-addons-2.0/extensions/xt_geoip.c: In function 'xt_geoip_mt4':

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:246: error: dereferencing pointer to incomplete type

/root/script/xtables-addons-2.0/extensions/xt_geoip.c: At top level:

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:330: warning: initialization from incompatible pointer type

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:331: warning: initialization from incompatible pointer type

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:340: warning: initialization from incompatible pointer type

/root/script/xtables-addons-2.0/extensions/xt_geoip.c:341: warning: initialization from incompatible pointer type

make[4]: *** [/root/script/xtables-addons-2.0/extensions/compat_xtables.o] Error 1

make[4]: *** Waiting for unfinished jobs....

make[4]: *** [/root/script/xtables-addons-2.0/extensions/xt_geoip.o] Error 1

make[3]: *** [_module_/root/script/xtables-addons-2.0/extensions] Error 2

make[3]: Leaving directory `/usr/src/kernels/2.6.32-642.6.2.el6.x86_64'

make[2]: *** [modules] Error 2

make[2]: Leaving directory `/root/script/xtables-addons-2.0/extensions'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory `/root/script/xtables-addons-2.0'

make: *** [all] Error 2




cent 6버전에 xtables2점대 설치시 버전 안맞아서 이런 저런 에러 나는듯....


iptables에 geoip 설정만 되면 되니까 걍 xtables1.4.7 버전 설치해도 상관없음


ps.

xtables 설치시 mconfig에 geoip 빼고 다 주석해도 상관없음

어차피 iptables geoip만 적용되면 되니까 딴건 필요없음















~/script/xtables-addons-1.47.1]# make -j 8

make  all-recursive

make[1]: Entering directory `/root/script/xtables-addons-1.47.1'

Making all in extensions

make[2]: Entering directory `/root/script/xtables-addons-1.47.1/extensions'

make -f ../Makefile.iptrules all;

Xtables-addons 1.47.1 - Linux make[3]: Entering directory `/root/script/xtables-addons-1.47.1/extensions'

  CC     libxt_geoip.oo

  CCLD   libxt_geoip.so

make[3]: Leaving directory `/root/script/xtables-addons-1.47.1/extensions'

2.6.32-642.6.2.el6.x86_64

if [ -n "/lib/modules/2.6.32-642.6.2.el6.x86_64/build" ]; then make -C /lib/modules/2.6.32-642.6.2.el6.x86_64/build M=/root/script/xtables-addons-1.47.1/extensions modules; fi;

make[3]: Entering directory `/usr/src/kernels/2.6.32-642.6.2.el6.x86_64'

  CC [M]  /root/script/xtables-addons-1.47.1/extensions/compat_xtables.o

  CC [M]  /root/script/xtables-addons-1.47.1/extensions/xt_geoip.o

/root/script/xtables-addons-1.47.1/extensions/compat_xtables.c: In function 'xtnu_ipv6_find_hdr':

/root/script/xtables-addons-1.47.1/extensions/compat_xtables.c:633: error: too few arguments to function 'ipv6_find_hdr'

make[4]: *** [/root/script/xtables-addons-1.47.1/extensions/compat_xtables.o] Error 1

make[4]: *** Waiting for unfinished jobs....

make[3]: *** [_module_/root/script/xtables-addons-1.47.1/extensions] Error 2

make[3]: Leaving directory `/usr/src/kernels/2.6.32-642.6.2.el6.x86_64'

make[2]: *** [modules] Error 2

make[2]: Leaving directory `/root/script/xtables-addons-1.47.1/extensions'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory `/root/script/xtables-addons-1.47.1'

make: *** [all] Error 2


위에 에러는 커널 뭐 어쩌구 안맞아서 설치가 안된단다. 


vim /lib/modules/2.6.32-642.6.2.el6.x86_64/build/include/linux/autoconf.h 

열어서
1574 /*#define CONFIG_IP6_NF_IPTABLES_MODULE 1*/

위에 처럼 주석한다.  /* 내용 */ 하면 안에있는것들 주석됨



펌 : http://www.uhoon.co.kr/mssql/2309


참고 Url 

http://technet.microsoft.com/ko-kr/library/bb838723(v=office.12).aspx (SQL Server 상태 모니터링)

http://technet.microsoft.com/ko-kr/library/bb510705(v=sql.105).aspx (모니터링(데이터베이스 엔진))



일전에 사내 디비서버 성능저하 현상으로 상태 체크하는 방법을 찾다가 알게된 정보입니다.

결과적으로는 별로 사용해보지 못했으나 유용한 정보입니다.

( 성능 저하 문제는 RAID IO 비율 하드웨어 셋팅 문제였다는.. HP .. Accelerator ratio Read/Write 비율 설정하는 옵션이 있더군요.. ..)



SQL Server 상태를 모니터링하기 위해 동적 관리 뷰 및 함수에 대해 일반적으로 사용하는 몇 가지 쿼리들..



- CPU 병목 현상 모니터링

CPU 병목 현상은 일반적으로 최적화되지 않은 쿼리 계획, 잘못된 구성, 잘못된 디자인 요소 또는 충분하지 않은 하드웨어 리소스 등으로 인해 발생합니다. 

다음은 CPU 병목 현상을 일으키는 원인을 찾아내기 위해 일반적으로 사용되는 몇 가지 쿼리입니다.

다음 쿼리를 실행하면 현재 캐시된 배치나 프로시저 중 CPU 사용률이 가장 높은 항목이 무엇인지 쉽게 파악할 수 있습니다.


1
2
3
4
5
6
7
8
SELECT TOP 50
      SUM(qs.total_worker_time) AS total_cpu_time,
      SUM(qs.execution_count) AS total_execution_count,
      COUNT(*) AS  number_of_statements,
      qs.sql_handle
FROM sys.dm_exec_query_stats AS qs
GROUP BY qs.sql_handle
ORDER BY SUM(qs.total_worker_time) DESC


다음 쿼리는 SQL 텍스트를 사용하여 캐시된 계획별로 집계한 CPU 사용량을 보여 줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
      total_cpu_time,
      total_execution_count,
      number_of_statements,
      s2.text
      --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text
FROM
      (SELECT TOP 50
            SUM(qs.total_worker_time) AS total_cpu_time,
            SUM(qs.execution_count) AS total_execution_count,
            COUNT(*) AS  number_of_statements,
            qs.sql_handle --,
            --MIN(statement_start_offset) AS statement_start_offset,
            --MAX(statement_end_offset) AS statement_end_offset
      FROM
            sys.dm_exec_query_stats AS qs
      GROUP BY qs.sql_handle
      ORDER BY SUM(qs.total_worker_time) DESC) AS stats
      CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2


다음 쿼리는 평균 이상의 CPU 사용률을 보이는 상위 50개 SQL 문을 보여 줍니다.

1
2
3
4
5
SELECT TOP 50
total_worker_time/execution_count AS [Avg CPU Time],
(SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_text, *
FROM sys.dm_exec_query_stats
ORDER BY [Avg CPU Time] DESC


다음은 과도한 컴파일/재컴파일을 찾기 위한 DMV 쿼리입니다.

1
2
3
4
select * from sys.dm_exec_query_optimizer_info
where
      counter = 'optimizations'
      or counter = 'elapsed time'


다음 샘플 쿼리에서는 다시 컴파일된 상위 25개의 저장 프로시저를 표시합니다. plan_generation_num은 쿼리를 다시 컴파일한 횟수를 나타냅니다.

1
2
3
4
5
6
7
8
9
10
11
select top 25
      sql_text.text,
      sql_handle,
      plan_generation_num,
      execution_count,
      dbid,
      objectid
from sys.dm_exec_query_stats a
      cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
where plan_generation_num > 1
order by plan_generation_num desc


쿼리 계획이 충분하지 않으면 CPU 사용량이 증가할 수 있습니다.
다음 쿼리에서는 가장 많은 누적 CPU 사용량을 보이는 쿼리를 표시합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    highest_cpu_queries.plan_handle,
    highest_cpu_queries.total_worker_time,
    q.dbid,
    q.objectid,
    q.number,
    q.encrypted,
    q.[text]
from
    (select top 50
        qs.plan_handle,
        qs.total_worker_time
    from
        sys.dm_exec_query_stats qs
    order by qs.total_worker_time desc) as highest_cpu_queries
    cross apply sys.dm_exec_sql_text(plan_handle) as q
order by highest_cpu_queries.total_worker_time desc


다음 쿼리에서는 '%Hash Match%', '%Sort%' 등과 같이 CPU를 집중적으로 사용할 수 있는 몇 가지 의심해볼 만한 연산자를 표시합니다.

1
2
3
4
5
6
7
select *
from
      sys.dm_exec_cached_plans
      cross apply sys.dm_exec_query_plan(plan_handle)
where
      cast(query_plan as nvarchar(max)) like '%Sort%'
      or cast(query_plan as nvarchar(max)) like '%Hash Match%'

쿼리 계획이 충분하지 않아 CPU 사용량이 높아졌다는 사실을 확인했다면 쿼리에 관련된 테이블에 대해 UPDATE STATISTICS를 실행하고 문제가 지속되는지 확인합니다.
그런 다음 데이터를 수집하고 그 문제를 PerformancePoint 계획 지원 센터에 보고합니다.
시스템에서 컴파일과 재컴파일이 과도하게 이루어지면 시스템의 CPU 관련 성능에 문제가 발생할 수 있습니다.
다음 DMV 쿼리를 실행하면 과도한 컴파일/재컴파일을 찾아낼 수 있습니다.
1
2
3
4
select * from sys.dm_exec_query_optimizer_info
where
counter = 'optimizations'
or counter = 'elapsed time'


다음 샘플 쿼리에서는 다시 컴파일된 상위 25개의 저장 프로시저를 표시합니다. plan_generation_num은 쿼리를 다시 컴파일한 횟수를 나타냅니다.

1
2
3
4
5
6
7
8
9
10
11
select top 25
sql_text.text,
sql_handle,
plan_generation_num,
execution_count,
dbid,
objectid
from sys.dm_exec_query_stats a
cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
where plan_generation_num > 1
order by plan_generation_num desc



- 메모리 병목 현상

메모리 부족 문제에 대한 감지와 조사를 시작하려면 먼저 SQL Server에서 고급 옵션을 활성화해야 합니다. 마스터 데이터베이스에 대해 다음 쿼리를 실행하여 우선 이 옵션을 활성화합니다.


1
2
3
4
5
6
sp_configure 'show advanced options'
go
sp_configure 'show advanced options', 1
go
reconfigure
go


다음 쿼리를 실행하여 메모리 관련 구성 옵션을 먼저 검사합니다.

1
2
3
4
5
6
7
8
9
10
sp_configure 'awe_enabled'
go
sp_configure 'min server memory'
go
sp_configure 'max server memory'
go
sp_configure 'min memory per query'
go
sp_configure 'query wait'
go


다음 DMV 쿼리를 실행하여 CPU, 스케줄러 메모리 및 버퍼 풀 정보를 확인합니다.

1
2
3
4
5
6
7
8
9
10
select
cpu_count,
hyperthread_ratio,
scheduler_count,
physical_memory_in_bytes / 1024 / 1024 as physical_memory_mb,
virtual_memory_in_bytes / 1024 / 1024 as virtual_memory_mb,
bpool_committed * 8 / 1024 as bpool_committed_mb,
bpool_commit_target * 8 / 1024 as bpool_target_mb,
bpool_visible * 8 / 1024 as bpool_visible_mb
from sys.dm_os_sys_info



- I/O 병목 현상

I/O 병목 현상은 래치 대기 시간을 조사하여 확인합니다. 다음 DMV 쿼리를 실행하여 I/O 래치 대기 시간에 대한 통계를 확인합니다.


1
2
3
4
select wait_type, waiting_tasks_count, wait_time_ms, signal_wait_time_ms, wait_time_ms / waiting_tasks_count
from sys.dm_os_wait_stats 
where wait_type like 'PAGEIOLATCH%'  and waiting_tasks_count > 0
order by wait_type


waiting_task_counts 및 wait_time_ms가 평상시와 비교하여 크게 달라졌으면 I/O 문제가 있는 것입니다. 이 비교를 위해서는 SQL Server가 안정적으로 실행되고 있을 때 성능 카운터와 주요 DMV 쿼리 출력의 기준선을 마련해 두는 것이 중요합니다.
이러한 wait_types를 살펴보면 I/O 하위 시스템이 병목 현상을 겪고 있는지 알 수 있습니다.
다음 DMV 쿼리를 사용하면 현재 보류 중인 I/O 요청을 확인할 수 있습니다. 이 쿼리를 정기적으로 실행하여 I/O 하위 시스템의 상태를 점검하고 I/O 병목 현상에 관련된 물리적 디스크를 격리하십시오.

1
2
3
4
5
6
7
8
9
select
    database_id,
    file_id,
    io_stall,
    io_pending_ms_ticks,
    scheduler_address
from  sys.dm_io_virtual_file_stats(NULL, NULL)t1,
        sys.dm_io_pending_io_requests as t2
where t1.file_handle = t2.io_handle

정상적인 상태에서는 대개 쿼리를 실행해도 아무 것도 반환되지 않습니다. 만일 이 쿼리에서 어떤 행이 반환된다면 더 자세한 조사를 해볼 필요가 있습니다.
다음 DMV 쿼리를 실행하여 I/O 관련 쿼리를 찾을 수도 있습니다.
1
2
3
4
5
6
7
8
select top 5 (total_logical_reads/execution_count) as avg_logical_reads,
                   (total_logical_writes/execution_count) as avg_logical_writes,
           (total_physical_reads/execution_count) as avg_physical_reads,
           Execution_count, statement_start_offset, p.query_plan, q.text
from sys.dm_exec_query_stats
      cross apply sys.dm_exec_query_plan(plan_handle) p
      cross apply sys.dm_exec_sql_text(plan_handle) as q
order by (total_logical_reads + total_logical_writes)/execution_count Desc


다음 DMV 쿼리를 사용하면 가장 많은 I/O를 생성하는 배치/요청이 무엇인지 찾을 수 있습니다. 

다음과 같은 DMV 쿼리를 사용하면 가장 많은 I/O를 생성하는 상위 5개 요청을 찾을 수 있습니다.

이러한 쿼리를 조정하여 시스템 성능을 향상시킬 수 있습니다.

1
2
3
4
5
6
7
8
9
10
select top 5
    (total_logical_reads/execution_count) as avg_logical_reads,
    (total_logical_writes/execution_count) as avg_logical_writes,
    (total_physical_reads/execution_count) as avg_phys_reads,
     Execution_count,
    statement_start_offset as stmt_start_offset,
    sql_handle,
    plan_handle
from sys.dm_exec_query_stats 
order by  (total_logical_reads + total_logical_writes) Desc



- 차단


다음 쿼리를 실행하면 차단 세션을 확인할 수 있습니다.

1
2
3
select blocking_session_id, wait_duration_ms, session_id from
sys.dm_os_waiting_tasks
where blocking_session_id is not null


이 호출을 사용하면 blocking_session_id를 통해 반환되는 SQL을 찾을 수 있습니다. 예를 들어 blocking_session_id가 87인 경우 SQL을 확인하려면 다음 쿼리를 실행합니다.

1
dbcc INPUTBUFFER(87)


다음 쿼리에서는 SQL 대기 상태 분석 및 대기 중인 상위 10개 리소스를 표시합니다.

1
2
3
4
select top 10 *
from sys.dm_os_wait_stats
--where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')
order by wait_time_ms desc


어떤 spid가 다른 spid를 차단하고 있는지 확인하려면 데이터베이스에 다음과 같은 저장 프로시저를 만들어 실행합니다.

이 저장 프로시저는 차단 상황을 보고합니다. 

@spid를 알아내려면 sp_who를 입력합니다. @spid는 선택적 매개 변수입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create proc dbo.sp_block (@spid bigint=NULL)
as
select
    t1.resource_type,
    'database'=db_name(resource_database_id),
    'blk object' = t1.resource_associated_entity_id,
    t1.request_mode,
    t1.request_session_id,
    t2.blocking_session_id   
from
    sys.dm_tran_locks as t1,
    sys.dm_os_waiting_tasks as t2
where
    t1.lock_owner_address = t2.resource_address and
    t1.request_session_id = isnull(@spid,t1.request_session_id)


다음은 이 저장 프로시저를 사용하는 예제입니다.

1
2
exec sp_block
exec sp_block @spid = 7


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

mssql 튜닝을위한 성능 모니터  (0) 2018.08.31
모니터링시 조치 방법  (0) 2018.08.31

설치방법 : 컴파일 옵션에다가 --enable-log-forensic=shared 추가하면 된다.




httpd.conf 에는 








LoadModule log_forensic_module modules/mod_log_forensic.so 요거 추가해주고


ForensicLog logs/forensic_log 요거 추가해준다




로그포멧은


LogFormat "%{forensic-id}n %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined




뭐랄까 모르겠다 .아직가지 효용성은

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

apache 오래된 버전 이전  (0) 2018.09.03
아파치 모듈 설명  (0) 2018.09.03
모드 씨큐리티 로그 분석 / mod security mod_security log analysis  (0) 2018.08.31
mod_xsendfile 설치 하기  (0) 2018.08.31
아파치 로그에 PID 쌓기  (0) 2018.08.31

.bash_profile 에다가 아래내용추가




export GREP_OPTIONS='--color=auto'




적용




source .bash_profile

엔진엑스-php 연동(즉 아파치 대신 엔진엑스를 사용하기)




1.mysql 설치


ㄴ엔진엑스-php 연동이랑은 상관없이 mysql 설치




2.엔진엑스 설치


ㄴ아파치 설치하듯이 엔진엑스 설치, 컴파일 옵션은 지라같은데 검색해보면 몇개 나올듯 혹은 엔진엑스 설치돼있는 서버 수소문해서 옵션 고대로 해도 되고... 사실 옵션이 그닥~중요하진 않음 고객사에서 요청한 옵션이 없는이상


꼴리는대로 해주면 됨




3.php 설치(엔진엑스 연동하기 위해서 php-fpm을 추가해줘야함)


ㄴ우리가 apm 설치할때 사용하는 옵션을 사용 , 단 옵션중에 추가/삭제해야할 옵션이 있음


빼야할꺼는 "--with-apxs2=/opt/apache/bin/apxs"   당연히 아파치 연동이 아니기 때문에


추가할꺼는 --enable-fpm --with-fpm-user=daemon --wtih-fpm-group=daemon   (with-ftpm user/group 옵션은 엔진엑스가  어떤 유저/그룹으로 올라오는지 보고 해야함. 엔진엑스 실행시키고 ps -ef 로 확인)






4.php-fpm 실행


4-1. /opt/php/etc/ 들어가면 php-fpm 관련 설정파일 수정적용후


ㄴ mv php-fpm.conf.default php-fpm.conf




 php-ftpm 실행


 /opt/php/sbin]# ./php-fpm 








 /opt/php/sbin]# ./php-fpm 


[01-Aug-2017 11:59:41] WARNING: Nothing matches the include pattern '/opt/php/etc/php-fpm.d/*.conf' from /opt/php/etc/php-fpm.conf at line 125.


[01-Aug-2017 11:59:41] ERROR: No pool defined. at least one pool section must be specified in config file


[01-Aug-2017 11:59:41] ERROR: failed to post process the configuration


[01-Aug-2017 11:59:41] ERROR: FPM initialization failed




에러 발생시






읽어보면 pool이 없다.  pool section을 설정해라 뭐 이런말인데  (warning은 무시해도 되는 메세지인데 여기서는 무시하면 안됨. 아래 내용 한번 더 읽어보면 알겠지만 결국은 설정파일을 못찾아서 나오는 문제였으니까)




 /opt/php/etc]# pwd


/opt/php/etc


/opt/php/etc]# ll php-fpm.conf


-rw-r--r-- 1 root root 4430 2017-08-01 11:38 php-fpm.conf




위 파일이 php-fpm.conf 실행할때 참조되는 설정파일이고 파일 내용 제일 밑에보면 아래 내용 있다.




include=/opt/php/etc/php-fpm.d/*.conf 




들어가보면 




 /opt/php/etc/php-fpm.d]# ll


total 20


-rw-r--r-- 1 root root 18500 2017-08-01 11:38 www.conf.default




위에 내용처럼 설정파일이 없어서 에러가 난다. 




mv www.conf.default www.conf




php-fpm 실행


root     24891     1  0 12:46 ?        00:00:00 php-fpm: master process (/opt/php/etc/php-fpm.conf)


daemon   24892 24891  0 12:46 ?        00:00:00 php-fpm: pool www


daemon   24893 24891  0 12:46 ?        00:00:00 php-fpm: pool www




올라온거 확인




5.php/엔진엑스 연동


nginx.conf 수정


[root@q353-0921 ~]# vi /opt/nginx/conf/nginx.conf




        location ~ \.php$ {


            root           html;


            fastcgi_pass   127.0.0.1:9000;


            fastcgi_index  index.php;


            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;


            include        fastcgi_params;


        }




위 부분 주석 해제(원래 주석돼있음, 너는 location 을 주석 해제 안했었어)






그리고 nginx 재시작


killall -9 nginx (또는 /opt/nginx/sbin/nginx -s reload //요거는 아파치graceful 같은ㄱ0


ㄴ엔진엑스는 nginx stop start restart 가 없음 그래서 구글같은데서 nginx 실행 스크립트라고 치면 많이 나오는데 그거 넣어주면됨)






php 정상 연동확인을 위한 info.php 파일 생성후 브라우저에서 아이피/info.php 접속


엔진엑스의 기본 홈 디렉토리는 /opt/nginx/html


ㄴ엔진엑스 nginx.conf  ㅇ안에 보면 아래처럼 root html 이 있는데 이게 root 디렉토리는 html 로 설정


        location / {


            root   html;


            index  index.html index.htm;


        }


ㄴ엔진엑스 통합관리 들어왔으니까 아파치처럼 가상호스트 추가하고 그런것정도는 알아둬야할듯






브라우저 접속시 아래 에러 발생


File not found. 




에러로그 확인해보면


2017/08/01 13:14:35 [error] 26172#0: *34 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 123.140.249.62, server: localhost, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "175.126.232.152"




Primary script unknown" while reading response header from upstream 요게 키포인트 인듯하다.


프라이머리 스크립트를 알수없다 ? 뭐 그런뜻인데 잘 모르겠으니까 구글링 검색




https://www.lesstif.com/pages/viewpage.action?pageId=24444977 여기보면 해결법이 나온다.




#           fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;


            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;




주석돼있는 부분이 fastcgi_param 즉 fastcgi_파라미터 를 어디를 참조할꺼냐 ? 뭐 그런거같은데 기존에는 /script로  돼있다. 이걸 위와같이 바꾸면 ($document_root 라는 함수는 아마도 홈디렉토리인 html 디렉토리를 가르킬듯)




아이피/info.php 접속해보면 phpinfo페이지 잘 뜸

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

히스토리, 명령어 저장등 script  (0) 2018.08.31
centos 6 xtables 설치시 에러  (0) 2018.08.31
vi 명령어 옵션  (0) 2018.08.31
libphp5.so: undefined symbol: unixd_config  (0) 2018.08.31
iptables 차단 정책 로그 쌓기  (0) 2018.08.31

퍼옴


http://linuxstory1.tistory.com/entry/SED-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%EB%B2%95



[스트림 편집기(SED)]

 

ed명령어와 grep명령어 기능의 일부를 합친 것이 sed(stream editor)명령어이다. sed명령어도 grep명령어와 같은 필터이지만 이 명령어는 파일을 수정할 수 있게 하는 반면 ed처럼 대화식처리는 불가능하다. sed명령어는 1개 라인씩 입력 라인을 읽어들여 표준출력으로 출력한다.

 

sed는 각 라인을 읽을 때마다 ed에서 사용하던 형식의 대치작업을 실행한다. 일치하는 문자열이 있으면 그 문자열을 대치한 후 출력하고 일치하는 문자열이 없으면 그 라인은 수정되지 않고 그대로 출력된다.

 

이 sed명령어가 ed보다 좋은 점은 라인들을 하나씩 읽고, 수정하고, 출력하기 때문에 기억장치 안의 버퍼를 사용하지 않는다는 것이다. 버퍼를 사용하지 않으면 파일의 크기에 제한 없이 작업을 할 수 있다. ed와 같이 버퍼를 사용하는 경우는 버퍼의 크기보다 큰 파일은 처리할 수 없으며 대개 버퍼의 크기는 1MB정도이다. 따라서 sed는 아주 큰 파일을 처리할 때 주로 사용된다.

 

sed 명령어를 호출하는 형식은 grep명령어와 같지만 완전한 형식의 대치 연산자를 사용한다는 점만이 다르다.

 

 

[sed 명령어 사용법]

 

----------------
치환(substitute)
----------------
sed 's/addrass/address/' list.txt
 : addrass를 address로 바꾼다. 단, 원본파일을 바꾸지 않고 표준출력만 한다.

 

sed 's/\t/\ /' list.txt : 탭문자를 엔터로 변환

 

------------
삭제(delete)
------------

sed '/TD/d' 1.html : TD 문자가 포함된 줄을 삭제하여 출력한다.

sed '/Src/!d' 1.html : Src 문자가 있는 줄만 지우지 않는다.

sed '1,2d' 1.html : 처음 1줄, 2줄을 지운다.

sed '/^$/d 1.html : 공백라인을 삭제하는 명령이다. (★★★)

 

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

sed 명령어의 다양한 사용예제

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

1. 특정문자열 바꾸기

 

2. 특정문자열이 포함된 행 삭제하기

 

 

3. 특정 문자열이 포함된 행에서 특정문자만 삭제하기

 

 

4. 파일의 일부만 편집해야 할 경 라인의 범위를 지정하여 사용 가능

 

5. 라인 번호 대신 문맥을 범위로 지정한 경우

 또한 문자열 goodbye를 만난 이후에도 다시 다른 hello가 등장하면 다음 goodbye가 나올 때까지 대치 작업은 반복된다.

 

6. 세번째 라인을 삭제

     
 7. hello 문자가 들어있는 line만 프린트

 

 8. 모든 line 출력과 동시에 hello line이 중복해서 나타남

 

9. princess 또는 Princess를 포함하고 있는 라인들을 삭제함

   

10. 라인 1부터 hello를 포함하고 있는 첫번째 라인까지 모든라인들을 삭제함

 

 11. datafile 안의 데이터로부터 처음 세 개의 문자들을 삭제

 

 12. datafile 안의 데이터로부터 마지막 세 개의 문자들을 삭제

 

13. 각 라인의 첫 번째 공백에서부터 마지막까지 삭제

 

14. 각 라인의 처음부터 맨 마지막 공백까지 삭제

 

15. 각 라인의 처음부터 : 문자가 있는 곳(:문자포함)까지 삭제

 

 

[sed 명령 하이라이트]

 

1. 각 라인마다 뒤에 Hello World! 문자를 입력

 

2. 3번재라인 뒤에 Good Morning 문자 삽입

 

3. 기존의 라인들을 Oh! My God!!! 문자로 대체시킴

 

4. q명령은 편집기로 하여금 그것이 명시된 라인에 도착한 뒤 중지하게 한다. 즉, 이 예제에서는 2라인만 보여주고 중지한다.

5. 특정라인의 문자 치환

※ 특정문자 전체를 바꾸려면 sed 's/hello/#####/g' datafile 과 같이 사용


/^$/   

공백라인, 즉 라인의 시작과 끝 사이에 아무것도 없는 라인과 부합한다. 이것은 공백 스페이스들로 된 라인과는 부합하지 않는바, 스페이스 자체가 문자이기 때문이다.

 

 

[간단한 sed 해법]

 

1.  모든 공백 라인 제거

      ※ sed '/^ *$/d' --> space로 만들어진 공백까지 제거

                                      (조심! ^와 *사이에 공백이 있어야 한다)

2. 각 line마다 공백라인 추가

 

 3. 각 line의 시작을 5 space로 대체

 

 

[sed 명령어의 또다른 기능]

sed명령어의 -f(file)선택자를 사용하면 명령어를 일일이 키보드에서 입력하지 않고 하나의 파일에 기억시켜 놓고 사용할 수도 있다.

 

     # sed -f command.file in.file

 

여러 개의 명령어를 연속적으로 자주 사용할 때 이 명령어 파일이 유용하게 사용된다.
예를 들어 다음과 같은 복수 개의 명령어가 파일에 기억되어 있는 경우는

     # vi command.file
       s/hello/goodbye
       s/good/bad

 

  다음과 같은 명령어를 입력하면 다음과 같이 출력된다.

     # echo "1234hello5678" | sed -f command.file
       => 1234badbye5678

모드 씨큐리티 로그 분석 / mod security mod_security log analysis


색깔 칠한 부분만 보면된다.


###파란색 글씨###

딱 보면 알겠지만 로그가 쌓일때 로그 ID이다. 

a~f / 0~9  8자리 랜덤 조합 그 뒤에 A, B, F, Z 등은 시간,접근방법, 탐지된 정책등의 정보가 담겨있다. 

SecAuditLogParts "ABIFHZ"  모드시큐리티 설정에 있다.

추가로

SecAuditLogRelevantStatus "^(?:5|4\d[^4])"  설정을 통해 404 등의 쓸때없는 페이지는 로그를 안 쌓을 수 있다.


###빨간색 글씨###

중요한 부분이다. 어떤식으로 접근했을때 탐지되었는지 알 수 있다.


###초록색 글씨###

어떤 정책에서 걸렸는지 알 수 있다. 



자세한건 로그 보면서 적겠지만 요약하자면


1.운영중인 홈페이지인 경우 2~4주정도의 탐지기간을 거쳐 로그를 검토하여 차단모드로 변경
ㄴ이유는 정상적인 접근도 차단 될 수 있기 때문이다. 

ㄴ만약 개발중인 사이트라면 처음부터 차단모드로 해놓고 안되는것들은 소스를 수정 & 정책을 주석하면 된다.


2.로그 분석은

먼저 파랑색 부분에서 동일한 로그끼리 보고 
빨간색 부분 체크하여 정상/비정상 유무 판단, (본인이 못하면 관리자, 개발자, 홈페이지 운영자등이 확인 가능)

정상이라면 초록색 부분에서 정책적용되지 않도록 해당 라인을 주석 / 비정상이라면 걸려서 접근 안된거니까 냅두면되고..





--892b4e44-A--   접근 시간 / 아아피등의 정보

[11/Aug/2017:13:44:57 +0900] WY02SX8AAAEAAAucFrcAAAAa 0.0.0.0 49410 0.0.0.0 443

--892b4e44-B-- 접근 URL 

GET /test/test.html?jb_type=G&ipZe%3D6199%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2C2%2C3%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%20..%2F..%2F..%2Fetc%2Fpasswd HTTP/1.1




Host: rsync.net

Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Accept-Encoding: gzip, deflate, br

Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4

Cookie: ACEUCI=1; PHPSESSID=a68fb899645d3c714231582cdd838ede; new_connect=0.0.0.0; ACEFCID=UID-598BEEBEC8E8787061A4F93F; ACEUCI=1; wcs_bt=s_23983

7b585db:1502424521

###Cookie 부분에서 php 세션 아이디 확인 가능### 만약 비정상적인 접근이라면 아이피확인하여 차단시켜도 좋다.


--892b4e44-F--

HTTP/1.1 200 OK    

###이부분 체크해야한다. 404 인지 400인지 혹은 200인지...  404나 403 처럼 파일이 없거나 퍼미션 denied 면 어차피 접근이 안된거라 상관없겠지만 200 이면 접근이 돼기는 했다는 거

X-Powered-By: PHP/5.2.17

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-cache, must-revalidate

Pragma: no-cache

P3P: CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"

Access-Control-Allow-Origin: *

Access-Control-Allow-Methods: POST, GET, OPTIONS

Access-Control-Allow-Headers: X-Requested-With, X-Prototype-Version

Keep-Alive: timeout=30, max=1000

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/html; charset=utf-8


--892b4e44-H--

Message: Warning. Pattern match "/etc/passwd" at REQUEST_URI. [file "/usr/local/apache/conf/mod_security.conf"] [line "300"]

##어느 정책에 걸렸는지 확인 가능하다. 위 내용은 /etc/passwd 라는 패턴이 URL에 들어가서 mod_security.conf 파일의 300째 라인의 정책에 탐지됐다는 내용

Message: Warning. Pattern match "\.\./" at REQUEST_URI. [file "/usr/local/apache/conf/mod_security.conf"] [line "306"]

##마찬가지로 URL에 ../ 라는 특문이 포함돼있어 306 라인의 정책에 탐지됐다.


Stopwatch: 1502426697568606 27545 (118 559 -)

Producer: ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/).

Server: Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips DAV/2 PHP/5.2.17


--892b4e44-Z--


위 로그를 정리하자면


http://naver.com/../../../etc/passwd 로 접속했기 때문에 ../ 와 /etc/passwd 두가지 정책에 걸려서 로그가 쌓인거다. 
보통 도메인 홈디렉토리는 /home/계스트명/www 처럼 어느정도 유추가 되기 때문에(실제 절대 경로도 확인 할 수 있음) 위와같이 http://naver.com/../../../etc/passwd 도메인을 접속하게 되면 서버에서는

/home/계스트명/www/../../../etc/passwd 파일을 확인 할 수 있다.





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

#!/bin/sh


err_num1=`grep "HTTP/1.1 404 Not Found" 2017.log_line | awk '{print $1}'`



for i in $err_num1;

do


err_num=`expr $i - 1`


sed -n  $err_num'p' 2017.log >> err_name1.txt

done


ERR=`cat err_name.txt`


for i in $ERR; do


echo $i


ERR_Z=`echo -ne "--"$i"-Z--"`

ERR_A=`echo -ne "--"$i"-A--"`



echo $ERR_Z 

echo $ERR_A



sed -i "/$ERR_A/,/$ERR_Z/d" 2017.log



done

#########


위 스크립트는 불피요한 로그들 삭제하는거 

404 나 낫 파운드는 어차피 파일이 없는거기 때문에 정상적인 접근일 수 가 없다.




사실 모드시큐리티 로그는 비정상적인 접근을 확인하고 해당 아이피를 차단하는것도 있겠지만

그것보다는 정상적인 접근을 확인해서 서비스중인 홈페이지에 장애가 되지 않도록 설정하는데 더 의미가 있다고 봄

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

apache 오래된 버전 이전  (0) 2018.09.03
아파치 모듈 설명  (0) 2018.09.03
apache module forensic log 설정  (0) 2018.08.31
mod_xsendfile 설치 하기  (0) 2018.08.31
아파치 로그에 PID 쌓기  (0) 2018.08.31

mod_xsendfile 설치하기


wget https://tn123.org/mod_xsendfile/mod_xsendfile-0.12.tar.gz


다운받고


압축풀고


들어가서 apxs -cia xsendfile파일이름 하면 알아서 다 됨


그리고 아파치 재시작하고 


apachectl -M 해서 잘 올라왔나 확인

+ sed -i /--fa642a31-A--/,/--fa642a31-Z--/d 2017.log




+ sed -i /삭제할 문장 시작/,/삭제할 문장 끝/d 파일명

perl -e 'open A,$ARGV[0]; open B,$ARGV[1]; @h{<A>}++; print grep {!exists $h{$_}} <B>' test input






ex)

cat test1.txt

aaa

bbb

ccc




cat test2.txt

aaa

ccc



perl -e 'open A,$ARGV[0]; open B,$ARGV[1]; @h{<A>}++; print grep {!exists $h{$_}} <B>' test2.txt test1.txt   


bbb

출처 http://mwultong.blogspot.com/2006/11/vim-vi-select-copy-paste.html


vi 복사




리눅스/유닉스의 빔(vim/vi) 에디터에서는


v, y, p

3개의 키로, 텍스트를 복사하여 다른 곳에 붙이는 작업을 할 수 있습니다.


 


텍스트 복사 붙이기 순서


(1) v : Visual mode 로 진입 (현재 문서를 편집중이라면 Esc키를 누르고, v키를 눌러야 함)


(2) 그런 후, 상하좌우 화살표키를 움직이면, 이제 선택 블록이 회색으로 잡힙니다. 복사할 부분을 선택합니다.


(3) y : yank (복사; Copy) yank는 '홱 잡아당긴다'는 뜻


(4) 문서를 스크롤하여, 복사된 텍스트를 붙어 넣을 곳으로 이동


(5) p : put (붙여 넣기; Paste)



이제 텍스트가 카피/붙이기 되었을 것입니다.


블록을 선택하다가 취소하고 싶을 경우에는, Esc키 또는 Ctrl+c 키를 누르면 됩니다.



 


컬럼 블록 (박스 블록) 선택하는 법


v키 대신에, Ctrl+v키를 누르면, 사각형 형태로 블록이 선택됩니다.


다만, 윈도우(Win32) 버전의 Gvim에서는, Ctrl+q 키를 눌러야 할 것입니다.



 


줄단위로 선택하기


소문자 v가 아닌, 대문자 V를 누르면, 줄단위로 선택됩니다. (소문자 v는 글자 단위로 선택됨)



 


선택 영역의 텍스트 지우기/삭제


선택된 텍스트를 지우려면, 블록이 선택된 상태에서 d 키를 누릅니다.

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

centos 6 xtables 설치시 에러  (0) 2018.08.31
nginx-php 연동 php-fpm fpm nginx php 연동  (0) 2018.08.31
libphp5.so: undefined symbol: unixd_config  (0) 2018.08.31
iptables 차단 정책 로그 쌓기  (0) 2018.08.31
sar 명령어 옵션 설명  (0) 2018.08.31

퍼옴 : xinet.kr


apache 2.4 버전에 php 5.2 x 설치를 하고 나서 httpd -t 를 하게 되면

libphp5.so: undefined symbol: unixd_config 에러가 발생된다


이것은 apache 버전업으로 인해서 심볼 명칭이 변경되었기 때문이다

그럼 이것을 해결하는 방법은 알아보자


방법은 간다하다 php 컴파일 진행하기전에 파일을 수정후에 진행하면 된다


먼저 php 압축된 폴더가 있다면 php_functiuons.c 파일을 열어서 386번 라인과 417번 라인에서 unix_config 부분을

ap_unix_config 라고 수정하면 된다.


[root@localhost php-5.2.17]# vi sapi/apache2handler/php_functions.c


386         AP_DECLARE_DATA extern unixd_config_rec unixd_config;

수정

386         AP_DECLARE_DATA extern unixd_config_rec ap_unixd_config;


417         snprintf(tmp, sizeof(tmp), “%s(%d)/%d”, unixd_config.user_name, unixd_config.user_id, unixd_config.group_id);

수정

417         snprintf(tmp, sizeof(tmp), “%s(%d)/%d”, ap_unixd_config.user_name, ap_unixd_config.user_id, ap_unixd_config.group_id);


위에 라인에서 총 4군데를 수정해주면 된다.


그리고 나서 php 컴파일 진행

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

nginx-php 연동 php-fpm fpm nginx php 연동  (0) 2018.08.31
vi 명령어 옵션  (0) 2018.08.31
iptables 차단 정책 로그 쌓기  (0) 2018.08.31
sar 명령어 옵션 설명  (0) 2018.08.31
dell / hp 서버 서비스 태그 확인하기  (0) 2018.08.31

mysql 처음 컴파일할때 아래 옵션 추가

-DWITH_INNODB_MEMCACHED=ON


###위 옵션 안해주면 플러그인에 innodb_memcached 설치 안됨






그다음 설치 다 하고




 # mysql -u root -p < /opt/mysql/share/innodb_memcached_config.sql


 # mysql -u root -p


mysql> install plugin daemon_memcached soname "libmemcached.so";








다하고 mysql 재시작하면 아래와같이 mysql 로 11211 포트 올라온거 확인됨




tcp        0      0 :::11211                    :::*                        LISTEN      7093/mysqld       


https://docs.google.com/document/d/1WE1V4uczxavqLY-nyr3qNqCxqzoOf8Vg6Z-Lf0c3DwU/edit#heading=h.4805uy5ihmx


유용한것도 있고... 첨보는것도 있고... 


mysql> set global log_slow_queries = ON;              


ERROR 1238 (HY000): Variable 'log_slow_queries' is a read only variable





####공식홈페이지 설명#######

One way around this is to setup the machine with the Slow Query Log 

enabled but to use a very large value of --long-query-time to 

essentially ignore every query. Then, when you want to capture slow 

queries, you reset --long-query-time to a reasonable value. 

Unfortunately, this requires a restart to initialize. After that you can 

adjust the --long-query-time to throttle the contents of the log.





mysql5.0 버전까지는 재시작없이는 설정이 안된단다. my.cnf에 등록하고 db 재시작해야한다. 5.1부터는 재시작없이 설정가능

+ Recent posts