본문 바로가기

golang2

[Go언어] API 서버간 내부 통신 시 too many open files 문제 다수의 API 서버를 실행 중이고, 각 서버간에는 주기적으로 상호 통신을 실행하고 있다. 이 때 일정 시간이 경과하면 아래와 같은 오류가 발생하면서 먹통이 되는 현상이 발생하였다. dial tcp: lookup 127.0.0.1: too many open files 먼저 메시지 내용 처럼 현재 얼마만큼의 파일이 Open 되었는지 확인해보기 위해 아래와 같이 lsof 명령을 사용하였다. lsof | wc -l 문제가 발생한 대상 API 서버에서 too many open files 발생 시 file open 수는 17141개 였는데 재시작 후 6994로 감소하였다. 이로 인해 프로세스 실행 후 문제가 발생한 시점까지 대략 10147개의 file open이 추가된 것으로 추정되는 상황이다. (다른 프로세스로 .. 2020. 12. 5.
[Go언어] for 루프에서 포인터 사용 시 동일 객체 참조 문제 문제 아래와 같이 for 루프를 사용했다. for _, data := range sampleDataSlice { GetStore().storeOne(&data) } 위 코드를 실행하면 저장된 모든 데이터가 동일한 값을 가지게 된다. 원인 위 코드에서 sampleDataSlice는 slice 이기 때문에 for 루프의 변수로 인덱스와 현 루프의 객체를 변수에 할당한다. 이 때, 인덱스를 사용하지 않고 그 뒤의 변수를 사용하게 될 경우 변수에는 슬라이스에 포함된 현재 요소가 지역 변수에 할당된다. 그러므로 변수에 할당되는 값은 계속 변경되지만 storeOne 함수로 전달되는 변수의 주소는 동일하기 때문에 storeOne 함수 안에서 사용한 변수는 결과적으로 제일 마지막에 지역변수에 할당했던 객체를 동일하게 .. 2020. 11. 17.