2021년 3월 20일 토요일
netstat말고 ss명령을 사용합시다.
2021년 1월 27일 수요일
단락 연산자(short-circuit operator)
리눅스에서 명령어를 연속 해서 사용 할 때가 있다.
보통 || 와 &&을 사용한다. 이를 단락 연산자(short-circuit operator)라고 한다.
첫번째 명령어를 실행하고 곧이어 두번째 명령어를 실행하는 역할이다.
예제는 다음과 같다.
[root@localhost ~]# true || echo 'ok' [root@localhost ~]# false || echo ok ok [root@localhost ~]#
||는 앞의 명령어 성공하면 뒤의 echo 'ok'는 실행하지 않는다.
앞의 명령이 실패하면 뒤의 echo 'ok' 명령를 실행한다.
&&은 ||과 반대이다. 앞의 명령이 성공하면 뒤의 명령을 실행한다.
앞의 명령이 실패하면 뒤의 명령을 실행하지 않는다.
[root@localhost ~]# true && echo 'ok' ok [root@localhost ~]# false && echo 'ok' [root@localhost ~]#
앞 명령어와 상관없이 실행하고자 할 때는 ;를 쓴다.
[root@localhost ~]# echo '1ok'; echo '2ok' 1ok 2ok [root@localhost ~]#
2020년 12월 17일 목요일
modelmapper memory leak
최근 추가한 코드를 테스트하는 개발서버에서 아래의 에러 메시지가 발생했다.
java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.reserveMemory(Bits.java:694) at java.nio.DirectByteBuffer.(DirectByteBuffer.java:123) at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) at io.netty.buffer.UnpooledUnsafeDirectByteBuf.allocateDirect(UnpooledUnsafeDirectByteBuf.java:111) at io.netty.buffer.UnpooledUnsafeDirectByteBuf. (UnpooledUnsafeDirectByteBuf.java:68) at io.netty.buffer.UnsafeByteBufUtil.newUnsafeDirectByteBuf(UnsafeByteBufUtil.java:626) at io.netty.buffer.UnpooledByteBufAllocator.newDirectBuffer(UnpooledByteBufAllocator.java:65) at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:179) at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:170) at io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:131) at io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator$MaxMessageHandle.allocate(DefaultMaxMessagesRecvByteBufAllocator.java:73) at io.netty.channel.socket.nio.NioDatagramChannel.doReadMessages(NioDatagramChannel.java:243) at io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:75) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:642) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:565) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:479) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:441) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) at java.lang.Thread.run(Thread.java:748)
추가한 부분은 udp 클라이언트 용도의 프로그램이었다.
소스를 분석해 봤지만 문제되는 부분을 알 수 없었다.
visulavm을 이용해 모니터링을 해봤더니, classes의 Total loaded 개수가 계속 증가하면서, Metaspace 영역이 계속 증가하는 현상을 확인했다.
dump를 받아서 mat 프로그램으로 분석했다. 잘 사용할 줄은 몰랐지만 대충 보다 보니 modelmapper가 보인다. 뭐지...
'modelmapper 성능 이슈'로 검색해 봤더니, 이런 글을 찾았다.
설마 하는 생각으로 modelmapper 부분을 제외했더니, 정상적으로 돌아왔다.
modelmapper는 예전부터 web 프로젝트에서 많이 사용했었기 때문에 이런 문제가 발생할 줄 몰랐다.
'modelmapper memory leak'으로 검색해서 더 알게 된 정보는 modelmapper는싱글톤으로 구성하여 사용하라는 것이다.
modelmapper를 많이 사용하지 않았기 때문에 전부 걷어내고 직접 지정하는 방식으로 변경했다.
이런 문제가 한 번 생기고 나니 modelmapper를 다시 사용하기 꺼려진다.
modelmapper memory leak으로 찾아 본 글
https://www.programmersought.com/article/1444628366/https://better-dev.netlify.app/java/2020/10/26/compare_objectmapper/
http://modelmapper.org/user-manual/faq/
https://github.com/modelmapper/modelmapper/issues/375
2020년 12월 5일 토요일
오라클 접속이 되다 안되다 하는 현상.
-Djava.security.egd=file:/dev/./urandom
2020년 10월 22일 목요일
ORA-12528, TNS:listener: all appropriate instances are blocking new connections.
1. 오라클 접속 하려고 했더니 아래와 같은 에러 발생.
oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12528, TNS:listener: all appropriate instances are blocking new connections.
2. 오라클 서버에 접속해서 리스너 상태 확인.
lsnrctl stat
상태가 BLOCKED로 나옴.
Instance "orcl", status BLOCKED, has 1 handler(s) for this service...
3. sqlplus 접속해서 오라클 재시작. ORA-00205 에러가 난다.
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.
...
Total System Global Area 1.0133E+10 bytes
Fixed Size 3721272 bytes
Variable Size 1778386888 bytes
Database Buffers 8321499136 bytes
Redo Buffers 29831168 bytes
ORA-00205: error in identifying control file, check alert log for more info
...
4. alert log 확인. alert log의 기본위치는 아래와 같다.
10g 이하는 $ORACLE_BASE/admin/$ORACLE_SID/bdump
11g부터는 $ORACLE_BASE/diag/rdbms/'DATABASE NAME'/$ORACLE_SID/trace
아래와 같은 에러 확인.
Wed Oct 21 17:55:04 2020
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
starting up 1 shared server(s) ...
ORACLE_BASE from environment = /home/oracle/app
Wed Oct 21 17:55:04 2020
ALTER DATABASE MOUNT
Wed Oct 21 17:55:04 2020
ORA-00210 : cannot open the specified control file
ORA-00202: control file: '/oradata/oradata/mydatabase/control01.ctl'
ORA-27086: unable to lock file - already in use
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 8
ORA-205 signalled during: ALTER DATABASE MOUNT...
Wed Oct 21 17:55:07 2020
Using default pga_aggregate_limit of 6440 MB
5.
/oradata 위치는 nfs로 연결된 스토리지이다.
/oradata/oradata/로 이동해서 파일 권한, 소유자 확인 했지만, 이상없음.
파일생성, 삭제, 수정 해봤지만, 정상임.
6.
에러 원인 확인 불가. 해결법은 찾음.
해결법은 에러가 나는 control01.ctl 파일이름을 변경 후 다시 원래 이름으로 복사.
오라클 중지 후 작업한다.
mv control01.ctl control01.ctl.bak
cp control01.ctl.bak control01.ctl
오라클 시작.
control01.ctl의 에러는 사라졌지만, /oradata 위치의 몇몇 파일들이 같은 문제를 일으킴. 역시 위와 같은 방식으로 다시 처리.
정상화 완료.
파일 디스크립터가 어떤 이유로 스토리지에서 열린 상태로 유지되어 발생하는 오류로 보인다. 아마도 네트워크에 뭔가 문제가 생겼을 때, 그냥 끊어져 버린게 아닌가 싶다.
2020년 10월 15일 목요일
버팀목전세자금 대출, 목적물 변경 및 증액 상담 내용.
최근 직장을 옮기고, 직장 근처로 이사를 위해 집을 알아 보고 있다. 전세로 가기 위해 준비하고 있으나, 내 예산안에 맞는 집을 찾기가 어렵다. 검색해 보다, 기존 전세대출을 목적물 변경과 증액을 이용하는 방법을 찾았다.
목적물 변경은 이사를 하게 되는 집을 바꾼다고 보면 되고, 증액은 기존 대출금에서 더 대출을 요청한다고 볼 수 있다.
인터넷으로는 알아보는 정보에 한계가 있고, 제대로된 정보를 얻기 위해 실제 은행에서 대출상담을 받았다.
내가 알아본 은행은 우리은행이다. 기존에 우리은행을 통해서 버팀목전세자금 대출을 받고 있었다.
대출 상담 내용을 요약하면 이렇다.
1. 1금융권은 재직 3개월이상만 대출이 가능하다고 한다.
2. 대출 증액은 계좌가 새로 생성되는 개념으로 버팀목전세자금 대출의 자격요건을 다시 본다. 증액을 받을 시 자격요건이 맞지 않으면 대출이 안된다.
3. 목적물 변경은 기존 계좌를 사용하는 개념으로 자격요건을 다시 보지 않는다.
4. 대출금을 갚으면 갚은 한도 만큼만 목적물 변경시 다시 대출이 가능하다. 예를 들어 처음 버팀목전세자금 대출을 받을 때, 1억을 대출 받고 도중에 6천을 갚으면, 목적물 변경시 적용되는 대출금은 4천이다. 나가는 이자를 조금이라도 줄이기 위해 대출금을 중간에 조금 갚은 게 오히려 독이 됐다.
결국은 기존에 살던 집의 전세를 넘는 집으로는 가기 어려울 것 같다.
목적물 변경만을 위해 필요한 준비물 및 순서는 다음과 같다.
1. 이사 이후에 전입신고를 한다.
2. 주민등록등본과 확정일자를 받은 임대차 계약서, 등기부 등본을 가지고 은행을 방문하여 신청한다.
3. 처음 대출을 받은 지점과 다른 지점인 경우 필요서류를 해당 지점으로 보내서 처리한다고 한다.
2020년 9월 25일 금요일
Elasticsearch SQL parsing_exception
엘라스틱서치에서 sql로 쿼리 실행시 특수문자가 들어간 경우 parsing_exception 에러가 난다.
이럴 때는 \" 를 사용하면된다.
ex>
{ "query" : "select * from \"my.data.day.20200925\"" }