본문 바로가기

컴퓨터/Server21

멀티 쓰레드 서버 버그잡기 2 멀티 쓰레드 서버 버그잡기 2전체 쓰레드 상황 빠른 스캔DB 쓰레드들은 GQCS에서 건전하게 대기 중IO 쓰레드들은 FlushSend에서 방황 중FlushSend 빠른 스캔I/O 쓰레드 대부분이 FastSpinlock에 걸려있다. 데...데드락?하지만 해당 임계영역에 블로킹 걸릴 소지가 없다. 단일 Lock만 사용하기에 Lock자원의 교착상태가 발생할 여지가 없다.실제로 덤프 시점에 하나의 쓰레드가 락을 빠져나가는 것이 포착되었다. Lock은 문제가 아니야. FlushSend를 호출하는 DoSendJob으로 화살을 돌려본다.DoSendJob 빠른 스캔DoSendJob은 Blocking이 걸리기 쉬운 구조로 생겼다. 의심이 증폭된다.세션의 FlushSend가 실패하게되면 LSendRequestSession.. 2015. 5. 27.
Logging Logging우리들은 자주 로그를 찍는다, 또는 찍어라 하고 말한다. 로그를 찍는것은 시스템의 상황을 외부 저장소에 기록하는 것을 의미한다. 약속된 특정 조건에서 약속된 내용을 저장하여 문제나 운영 상황을 파악하기 쉽게 만들어 주는 역할을 한다. 앞서 말한 dump도 로그의 일종이라고 생각한다.Log Library로그를 찍어야한다. 처음 생각하기 쉬운 방법은 fprintf등으로 파일에 출력하기이다. 직접 정보를 쉽게 다룰 수 있다는 점은 좋다. 하지만 로그 파일을 안정적으로 다루는 것은 또 다른 문제이다. 추가로 동기적 I/O 형태의 호출이므로 성능이슈도 뒷따른다. 혹여 멀티쓰레드 프로그래밍을 해야된다면, fprintf를 쓸 마음이 점점 사라지게 될 것이다.그리고 일반적으로 로깅을 할 때 하나의 자료에만.. 2015. 5. 16.
Exception Filter Exception FilterException이란 내 생각엔 버그다. 프로세스가 정상적인 동작을 할 수 없을 때, 예외 이벤트가 발생하여 운영체제에서 프로세스를 강제 종료시켜버린다. 좀 규모가 있는 프로그램을 만들어서 돌리다보면 (거의 대부분의 나의 코드에서) 예상치못한 Exception이 발생한다. 디버그 모드에서 테스트할때는 괜찮았는데, 리얼로 배포해서 돌리다보면 생각지도 못한 곳에서 예외가 발생하기도 한다. 예외를 깔끔히 처리하는 것은 안전한 코드를 생산적으로 처리하는데 도움이 된다.SEHWindows에서는 이 예외처리를 잘 할 수 있게 SEH라는 구조를 제공한다. 자세한 내용을 여기서 다루지는 않을 예정이다. 간단하게 설명하자면 정상적인 실행코드가 담기는 __try블록과, 종료처리 또는 예외 처리.. 2015. 5. 15.
Stored Procedures Stored ProcedureDB 내부에 저장된 일련의 SQL 명령문들을 마치 하나의 함수처럼 실행하기 위해서 쿼리를 묶어둔것. 반드시 값을 리턴할 필요가 없다는 점에서 함수와 다르다. (stored function은 반드시 결과값 리턴해야함) DB를 하다보면 여러 쿼리를 같이 써야지만 원하는 기능을 수행할 수 있는 경우가 종종 발생하는데, 이때 일련의 동작을 묶어서 그리고 기존 함수의 유용한 기능들 (조건분기, 변수저장)을 포함시켜서 보다 유연하게 사용할 수 있도록 만들어둔 것이 stored procedure이다.장점과 단점DB 작업은 어쩃든 I/O다. 명령을 여러번 수행하면 그때마다 I/O를 수행하는데 부하가 걸린다. Stored Procedure는 DB(서버)에 저장하여 내부적으로 동작하기 때문에 .. 2015. 5. 9.