jvm(일반 애플리케이션)이 실행 중인 서버에서 slab memory가 끊임없이 늘어나는 현상이 발견되었다.



* slab 메모리가 있는지 확인하기 위해 다음 링크를 참조하면 쉽게 slab 메모리 정보를 구할 수 있다. (/proc/meminfo에서 Slab 영역을 얻는다)

http://atomitech.jp/hinemos/blog/?cat=12


#!/bin/bash

total=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
free=`cat /proc/meminfo | grep MemFree | awk '{print $2}'`
buff=`cat /proc/meminfo | grep Buffers | awk '{print $2}'`
cache=`cat /proc/meminfo | grep ^Cached | awk '{print $2}'`
slab=`cat /proc/meminfo | grep Slab | awk '{print $2}'`
used=`echo "scale=2; ($total - $free - $buff - $cache - $slab) * 100 / $total" | bc`
echo "used,$used"






참고로 jvm 메모리 상태를 확인하며 gc 여부를 확인했지만 특별히 변경 내역은 없었다.


$ jstat -gc 프로세스-id 1 1

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT

 0.0   2048.0  0.0   2048.0 2383872.0 624640.0 1808384.0  1099923.5  61056.0 60410.3 7296.0 7135.3  32873  338.821   3      0.999  339.821

 



jvm은 이슈가 아닌 것 같고, vmstat으로 메모리 상태를 확인했다. 

각 필드의 항목 내용은 Num  Total   Size  Pages이다. 확실히 개수와 용량이 늘긴 늘었다

(vmstat 참고 : https://www.thomas-krenn.com/en/wiki/Linux_Performance_Measurements_using_vmstat#vmstat_-m)



$ vmstat -m  | grep proc_inode_cache

proc_inode_cache         4511372 4513830    656      6




다른 장비에서 동일한 명령어를 실행해서 동일하게 메모리를 확인했다. 


$ vmstat -m  | grep proc_inode_cache

proc_inode_cache          17500  17514    656      6




확실히 inode 캐시 값이 너무 커졌다. 이를 정리하기 위해 운영 체제의 vfs_cache_pressure를 사용해야 했다.



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

vfs_cache_pressure
------------------

This percentage value controls the tendency of the kernel to reclaim
the memory which is used for caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.

 




jvm이 통신하면서 임시로 메모리 공간(pagecache)을 사용한 것 같은데, 정리가 안되면서 커진 것 같았다.  캐시 데이터는 centos 내부적으로 slab 메모리로 관리된다. inode가 커널의 slab 메모리에서 관리되기 때문에 inode와 slab 메모리가 상당히 커진 것 같았다. 


vfs_cache_pressure는 pagecache를 반환하려는 값이 저장되어 있다. 기본값은 100이다. 위의 문서에 설명되어 있듯이 0이면, 메모리 반환을 하지 않고, 1000을 설정하면 계속 free공간으로 메모리를 반환하려 한다.



나는 아래와 같이 값을 큰 값을 주어 자연스럽게 slab 메모리가 빨리 정리되게 했다. 


$ echo 10000 > /proc/sys/vm/vfs_cache_pressure



문제는 전혀 발생하지 않았고, slab 메모리를 깔끔히 정리되었다. 


이 외에 다른 방법이 있다고 한다. 



https://community.oracle.com/thread/3553285?start=0&tstart=0


To free pagecache: echo 1 > /proc/sys/vm/drop_caches

To free reclaimable slab objects (includes dentries and inodes): echo 2 > /proc/sys/vm/drop_caches

To free slab objects and pagecache: echo 3 > /proc/sys/vm/drop_caches





참고로 hbase에서는 이슈가 있었다고 하니. 부하가 높은 상황에서는 조심히 사용할 필요는 있을 것 같다. 


https://brunch.co.kr/@alden/14





Posted by '김용환'
,

[git] git log 범위

etc tools 2016. 8. 24. 16:52



특정 git hash를 얻어와서, 지금까지의 history를 한 번에 보고 싶다면 git log 와 ..를 활용할 수 있다. 


git log #{from}..#{to} 이런 느낌으로 실행하면 된다.


git log ${git_hash}..HEAD


'etc tools' 카테고리의 다른 글

[influxdb] influxdb clustering은 무료 버전?  (0) 2017.03.23
[git] git 저장소 변경하기  (0) 2017.03.16
[git] git hash 얻기  (0) 2016.08.24
artifactory 설치하기  (0) 2016.01.30
[gradle] provided compile  (0) 2015.11.30
Posted by '김용환'
,


git log를 보면 좀 산만하게 보인다. 이를 pretty format을 사용한 다음, 적절한 format 양식을 다음처럼 사용하면 한 줄씩 git log를 볼 수 있다.



$ git log --pretty=format:"%h - %an, %ar - %s"


0e57fbc - knight76, 5 weeks ago  - pom.xml version up

Posted by '김용환'
,

[git] git hash 얻기

etc tools 2016. 8. 24. 16:16


git hash를 얻는 부분이다. 


 yte

길게 보려면 rev-parse를 쓸 수 있다.


$ git rev-parse master

0effa0fcc670fc999ee979e95be931decba13114



긴 hash라서 짧은 hash를 이용하려면 아래와 같이 사용할 수 있다. 1byte째부터 7byte까지가 short hash이다. 



$ git rev-parse --short master

0effa0f



$ git log -1 --pretty=format:%h

0effa0f



$ git describe --always

0effa0f

'etc tools' 카테고리의 다른 글

[git] git 저장소 변경하기  (0) 2017.03.16
[git] git log 범위  (0) 2016.08.24
artifactory 설치하기  (0) 2016.01.30
[gradle] provided compile  (0) 2015.11.30
gradle 2.9 - 50% 줄어든 컴파일 속도  (0) 2015.11.26
Posted by '김용환'
,



BBC에서 BBC 홈페이지를 어떻게 만들었는지 간단하게 소개한 내용이 있다.


http://www.bbc.co.uk/blogs/internet/entries/47a96d23-ae04-444e-808f-678e6809765d



여기에서 주목할 내용은 Continuous Delivery를 위해 Acceptance test 용으로 mocha라는 툴을 썼다고 나온다.


http://mochajs.org/

https://github.com/mochajs/mocha



star가 10,000개가 넘을 정도로 인기가 좋다. 기회가 된다면 써봐야지..




describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      [1,2,3].indexOf(5).should.equal(-1);
      [1,2,3].indexOf(0).should.equal(-1);
    });
  }); 

});


Posted by '김용환'
,