$ cat mon-shm.sh
#!/bin/sh

# svmon -P $pid 으로 각 프로세서가 쓰고 있는 메모리를 추산한다.


# 이 값보다 큰 프로세스만 보여준다.
CNT_CHK=8
#echo "CNT_CHK:$CNT_CHK"

# input (file name )
INPUT_FILE_PATH="/home/cts/src/chk/process.lst"
TMP_FILE_PATH="/tmp/tmp-process-shm.lst"
DATE=`date '+%Y-%m-%d %H:%M:%S'`

grep  "^[a-zA-Z]" $INPUT_FILE_PATH > $TMP_FILE_PATH


echo "------------------------------------------------------------------------"
echo "$DATE 에 측정했습니다."
echo "------------------------------------------------------------------------"
echo ""
echo "Count 의 최대값은 11(또는 13)입니다."
echo "최대값에 가까워진 프로세스는 공유메모리 attach 수를 낮추어야 합니다 "
echo ""
echo "------------------------------------------------------------------------"
echo ""



while read line
do
        eval `echo $line|awk ' { printf(" process=%s;\n", $1) } '`
#       echo "process:$process"
        cnt=`ps -e|grep $process|grep -v grep|grep -v vi|wc -l`
        #echo "cnt:$cnt";
        if [ "$cnt" == "" ]
        then
                cnt=0
        fi

        if [ "$cnt" -eq 1 ]
        then
                pid=`ps -e|grep $process|awk '{printf $1}'`
        #       echo "pid:$pid"
                cnt_shm=`svmon -P $pid| grep -e "work shared memory segment" -e "work unused segment" |wc -l`
        fi
#exit;
       
        #echo "cnt_shm:$cnt_shm";
        if [ "$cnt_shm" == "" ]
        then
                cnt_shm=0
        fi
       
       
       
        if [ "$cnt_shm" -gt "$CNT_CHK" ]
        then
                echo "Pid:[$pid]\tPname:[$process]\tCount:[$cnt_shm]"
        fi
       
        #echo "-------------------------------"
done < $TMP_FILE_PATH


aix 에서 compile error

header (*.h) 파일을 빠뜨렸을 때 나는 에러이다


0403-057

분류없음 2010.12.23 15:23
 AIX ksh 0403-057 Syntax error: `(' is not expected error ...

점검할 것
# makefile 에 에러가 없는 지
# make clean 을 하지 않고 make 하고 있는지


아래처럼 하면 한 프로세스가 attach 하고 있는 공유메모리를 알 수 있다.
#svmon -P $PID|grep -e "shared memory segment" -e "unused segment"

ipcs -mP 를 이용해서 Vsid(Virtual Segmentation ID) 를  찾아보면 공유메모리 키도 알아낼 수 있다.


1.  보통 컴파일 후 실행파일 편집
-bmaxData:0xD0000000/dsa 위처럼 컴파일 옵션을 넣어서 링크해 보았으나 실패.
아래처럼 보통 링크 후 편집했더니 잘 된다
/usr/ccs/bin/ldedit -bmaxdata:0xD00000000/dsa a.out
물론 위 문장을 makefile 안에 넣어서 쓰면 된다.

2. 아래는 데몬에 적용하기 힘들어서 안 쓰고 있다. putenv 등을 해보았는데 잘 안된다.
export LDR_CNTRL=MAXDATA=0@DSA 하면 공유메모리를 13 개까지 사용할 수 있다.


3.
EXTSHM=ON 위 옵션도 256Mb 이상 공유메모리가 하나라도 있으면 역시 실패


이상은 모두 32bit application 얘기다.


분명히 정적 오브젝트인 것 같은데, 관련 프로그램을 다시 컴파일하지 않으면 오류가 발생한 적이 여러 번 있었다.

오늘에서야 의문이 풀렸다.

내가 정적(static) 이라고 생각했던 것은, 공유 오브젝트였다.

아마 확장자가 *.a 여서 그렇게 판단했을 텐데, AIX 에서는 확장자로 정적/공유 를 구분하지 않는다고 한다.

정적인지 공유인지 구별하는 방법은

$ dump -ov 오브젝트

의 결과에 SHROBJ 가 있으면 공유, 없으면 정적이라고 한다.

아래는 참고 문서이다.

오브젝트 파일이 공유 오브젝트인지 정적 오브젝트인지 구분하려면 dump 명령을 사용해야 한다. 예제 2-3에서 Flags 줄에 SHROBJ 키워드가 나오는데 이 경우 이 오브젝트 파일은 공유 오브젝트이고 이 키워드가 안 나오면 정적 오브젝트이다.
$ dump -ov shr.o
shr.o:
***Object Module Header***
# Sections Symbol Ptr # Symbols Opt Hdr Len Flags
5 0x00251764 26925 72 0x3002
Flags=( EXEC DYNLOAD SHROBJ )
Timestamp = "Feb 03 08:59:14 2003"
Magic = 0x1df (32-bit XCOFF)


(출처:
http://www-903.ibm.com/kr/techinfo/pseries/tech/Developing_C_C++_Application_on_AIX_AIX_DIY(SE).pdf
)


몇 시간 동안 삽질 후에 성공했다.
* tar 를 root 로 풀어야 하는 것
* 관련 라이브러리(내 경우에는 libintl.a)를 LIBPATH 에 추가해주는 것이 중요

1. 아래 URL 에서 binary  받음. 파일 복사(설치하지 않았음)
http://www.open.collab.net/downloads/community/

2. 서버에 복사
subversion-1.4.6-apache-python.tar 를 서버의 /tmp 에 ftp 로 올렸다.

3. root 로 /opt/... 에 tar 풀었다
$ su - root
# cp /tmp/subversion-1.4.6-apache-python.tar /
# cd /
# tar -xvf subversion-1.4.6-apache-python.tar

3. ~/.profile LIBPATH에 추가.
/usr/opt/freeware/lib 를 추가하지 않았을 때는 에러가 난다. 항목 4 를 참고.
/usr/opt/freeware/lib 경로는 lslpp -fc | grep libintl 명령으로 추정한 것이다.

LIBPATH="/usr/opt/freeware/lib":$LIBPATH
LIBPATH="/opt/subversion/lib":$LIBPATH
export LIBPATH

4.  참고 에러 메시지
arbi9:root:/opt/subversion/bin#svn
exec(): 0509-036 다음 오류 때문에 svn 프로그램을 로드할 수 없습니다.
        0509-150   종속 모듈 /home1/sybase/OCS-12_5/lib/libintl.a(libintl.so.1)이(가) 로드되지 않았습니다.
        0509-152   libintl.so.1 멤버가 아카이브 에 없습니다.