LogParser 를 이용한 SharePoint 운영 현황 분석
MOSS 2007 을 운영하고 계신 관리자 분들이라면 서버의 여러가지 현황 수치를 분석하고 싶은 경우가 많을 것입니다.
예를 들면 실제로 몇 명 정도의 사용자가 MOSS 를 사용하는지, 또는 시스템 부하가 실제 어느 정도인지 같은 데이터들입니다.
MOSS 는 실제로 이러한 통계 부분에 있어 기본 콘솔로 관리자에게 충분한 정보를 제공하지 못하는 아쉬움이 있습니다만
이러한 정보들은 이미 IIS 로그에 저장되어 있는 상태이기 때문에 로그 파서와 엑셀을 통하여 원하는 수치들을 뽑아낼 수 있습니다.
백서 Analyzing Microsoft SharePoint Products and Technologies Usage 는 이러한 분석 작업을 직접 수행할 수 있는 자세한 가이드를 제공합니다.
백서의 간략한 내용은 아래와 같습니다.
IIS 로그와 로그파서의 준비
IIS 로그는 프런트 엔드에서 수집하며, 서버에서 로그파서를 수행하면 서버에 부하를 줄 수 있기 때문에 별도의 클라이언트 PC 에 복사한 후 로그파서를 통하여 분석합니다. ( 로그파서 무료 다운로드 : Log Parser 2.2 )
수집되어야하는 로그의 옵션은 아래와 같고, 이 사항은 IIS 관리자에서 확인할 수 있습니다.
Field |
Column name |
Date |
date |
Time |
time |
Client IP Address |
c-ip |
User Name |
cs-username |
Method |
cs-method |
URI Stem |
cs-uri-stem |
Protocol Status |
sc-status |
Protocol SubStatus |
sc-substatus |
Bytes Sent |
sc-bytes |
Bytes Received |
cs-bytes |
Time Taken |
time-taken |
User Agent |
cs-user agent |
프런트 엔드 서버가 여러대로 로드밸런싱 되는 경우는 분석된 데이터가 로드밸런싱 된 것을 고려해 주거나, 각각 분석 작업을 진행하여 취합하는 등의 고려가 필요 합니다.
백서의 Load Balancing 부분을 참고 바랍니다.
몇 가지 로그 파서 명령과 결과
백서에 기록되어 있는 로그 파서를 이용한 분석 방법 중 몇 가지를 뽑아 보았습니다.
- 시스템의 유니크 사용자
쿼리 대상 기간의 로그 파일에서 유니크한 방문자를 계산합니다. 한달치의 로그 파일을 대상으로 아래 쿼리를 수행하면 한달동안의 유니크 사용자 수가 산출됩니다.
logparser -i:IISW3C "select count(distinct cs-username) from *.log"
- 시스템을 가장 많이 쓰는 Top 사용자
아래 명령어로 알 수 있으며, 쿼리 대상 기간의 로그 파일에서 가장 시스템을 많이 사용한 20명을 뽑습니다.
logparser -i:IISW3C "select top 20 count(*) as ct,cs-username as user from *.log group by user order by ct desc"
- 사용자 유형 분포
사용자 유형 분석은 MOSS 를 열심히 쓰는 사람, 중간정도 쓰는 사람, 잘 안쓰는 사람의 비율이 어느 정도인지, 또 그들이 어떻게 그룹핑 될 수 있는지를 알게 해줍니다.
예를 들어 저희 테크넷 에서는 다음과 같이 사용자 유형을 분류합니다.
User load Request rate Light 시간당 20 요청 Typical 시간당 36 요청 Heavy 시간당 60 요청 Extreme 시간당 120 요청 위의 사용자 그룹핑은 순전히 Microsoft 의 가정값일 뿐입니다. 실제 내가 운영하는 서버에서는 사용자 그룹이 다르게 정의될 수 있습니다.
과정의 첫번째로는 로그 파일을 분석하여 사용자를 그룹으로 나누는 것입니다. 아래와 같은 로그파서 쿼리를 수행하여 요청수 합계와 사용자 목록을 CSV 파일로 출력합니다. 사용자를 그룹으로 나누기 위하여 요청수의 합계의 자연로그값을 이용합니다. (아래 명령어의 bin)
logparser -i:IISW3C -o:CSV "select count(*) as ct,TO_INT(LOG(count(*))) as bin,cs-username from *.log where sc-status<>401 group by cs-username order by ct desc" -q >userfreq.csv
다음으로는 아래 커멘드를 통하여 CSV 파일에 출력된 요청수와 사용자들을 그룹 별로 합산합니다.
logparser -i:CSV "select sum(ct),count(*),bin from userfreq.csv group by bin order by bin desc" –q
결과를 엑셀에 텍스트 마법사를 사용하여 복사한 후 시간당 요청수를 추가합니다. 분석 대상이 되는 로그 파일이 하루 분이면 요청수를 사용자수와 24 로 나누면 됩니다.
위 결과에서 구분(bin) 6,7,8 그룹이 Microsoft 의 Light, Typical, Extreme 과 유사하지만 실제 사용자 유형은 0.04 부터 861까지 더 분포가 다양함을 알수 있습니다.
( 사용자 수가 1,2 인 그룹 13,12 는 MOSS 어플리케이션 계정입니다.) 위에서는 총 14 구간이지만 4 구간으로 나누어 매핑해보면 좀 더 정형화 된 사용자 프로파일 그룹이 가능할 것입니다.
- 시간에 따른 RPS 분포 - Request (RPS) distribution over time
RPS (Request Per Second) 는 초당 서버에 전달되는 사용자 요청수의 합으로써 사이징 시에 기본 고려 값이 됩니다. RPS 를 시간대에 맞추어 뿌려보면 시간대 별로 서버 부하가 어떻게 달라지는지를 알 수 있습니다.
이 분석을 위한 쿼리는 조금 복잡하기 때문에 텍스트 파일로 작성하여 로그파서에 전달합니다.
select EXTRACT_FILENAME(LogFilename),LogRow,
date, time, cs-method, cs-uri-stem, cs-username, c-ip, cs(User-Agent), cs-host, sc-status, sc-substatus, sc-bytes, cs-bytes, time-taken,
add(
add(
mul(3600,to_int(to_string(to_localtime(to_timestamp(date,time)),'hh'))),
mul(60,to_int(to_string(to_localtime(to_timestamp(date,time)),'mm')))
),
to_int(to_string(to_localtime(to_timestamp(date,time)),'ss'))
) as secs,
to_int(to_string(to_localtime(to_timestamp(date,time)),'yy')) as yy,
to_int(to_string(to_localtime(to_timestamp(date,time)),'MM')) as mo,
to_int(to_string(to_localtime(to_timestamp(date,time)),'dd')) as dd,
to_int(to_string(to_localtime(to_timestamp(date,time)),'hh')) as hh,
to_int(to_string(to_localtime(to_timestamp(date,time)),'mm')) as mi,
to_int(to_string(to_localtime(to_timestamp(date,time)),'ss')) as ss,
to_lowercase(EXTRACT_PATH(cs-uri-stem)) as fpath,
to_lowercase(EXTRACT_FILENAME(cs-uri-stem)) as fname,
to_lowercase(EXTRACT_EXTENSION(cs-uri-stem)) as fext
from *.log
where sc-status<>401
위의 쿼리를 load.txt 파일로 만들고 아래 로그파서 쿼리를 수행하여 1차 가공한 데이터 파일인 bigo.csv 를 만듭니다.
logparser -i:IISW3C file:load.txt -o:csv -q >bigo.csv
다음 과정으로는 이 bigo.csv 파일로부터 분당 분포값과 초당 분포값을 뽑습니다.
초 단위 : logparser -i:CSV –o:CSV "select count(*) as ct,secs,max(ss) as ss,max(mi) as mi,max(hh) as hh from bigo.csv group by secs order by secs" -q >secsdist.csv
분 단위 : logparser -i:CSV -o:CSV "select count(*) as ct,div(secs,60) as minu,max(ss) as ss,max(mi) as mi,max(hh) as hh from bigo.csv group by minu order by minu" -q >mindist.csv
다음으로 위의 파일에서 시간별 평균값과 분/초당 최대값을 뽑을 수 있습니다.
시간별 평균 : logparser –i:CSV "select hh,avg(ct) from mindist.csv group by hh order by hh"
분당 최대 : logparser -i:CSV "select hh,max(div(ct,60)) from mindist.csv group by hh order by hh"
초당 최대 : logparser -i:CSV "select hh,max(ct) from secdist.csv group by hh order by hh"
실제 저희 팀 서버를 가지고 분석해 보니 결과가 아래와 같습니다. 새벽 2~4 시에 평균치가 매우 높은 것은 검색 크롤링 스케쥴 때문입니다.
기타 백서에 나와 있는 로그 파서로 분석할 수 있는 데이터들은 아래와 같습니다.
- Distinct users over time – 시간별 유니크 사용자 수
- User agent distribution – 사용자 클라이언트 활용 비율을 분석할 수 있습니다. 예를 들어 오피스 클라이언트 연동 기능을 얼마나 사용하는지, SharePoint Designer 를 얼마나 사용하는지 등을 알 수 있습니다.
- Browser usage – 브라우저 사용 패턴을 분석할 수 있습니다. 가장 많이 요청되는 파일이나 페이지를 분석하여 시스템 최적화 고려값으로 사용 가능합니다.
- Office client Web Service usage – 오피스 클라이언트로부터의 요청을 분석할 수 있습니다.
- Slow pages – 사용자 반응이 느린 시간대를 분석할 수 있습니다.
- Importing logs into SQL Server – 로그를 SQL 로 넣어서 추가적인 분석을 할 수 있도록 하는 방법입니다.