본문 바로가기

2015/0513

멀티 쓰레드 서버 버그잡기 2 멀티 쓰레드 서버 버그잡기 2전체 쓰레드 상황 빠른 스캔DB 쓰레드들은 GQCS에서 건전하게 대기 중IO 쓰레드들은 FlushSend에서 방황 중FlushSend 빠른 스캔I/O 쓰레드 대부분이 FastSpinlock에 걸려있다. 데...데드락?하지만 해당 임계영역에 블로킹 걸릴 소지가 없다. 단일 Lock만 사용하기에 Lock자원의 교착상태가 발생할 여지가 없다.실제로 덤프 시점에 하나의 쓰레드가 락을 빠져나가는 것이 포착되었다. Lock은 문제가 아니야. FlushSend를 호출하는 DoSendJob으로 화살을 돌려본다.DoSendJob 빠른 스캔DoSendJob은 Blocking이 걸리기 쉬운 구조로 생겼다. 의심이 증폭된다.세션의 FlushSend가 실패하게되면 LSendRequestSession.. 2015. 5. 27.
Modern Effective C++ Item 34 : std::bind 보다 람다를 쓰자 std::bind보단 람다를 쓰자.std::bind는 C++98에서 std::bind1st와 std::bind2nd 그리고 stl에서 2005년부터, 그 이전에는 TR1에서부터 쭉 많은 사람들에게 사용되었다. 그래서 누군가는 std::bind를 버리라는 말이 띠껍게 들릴지도 모른다. 하지만 C++11에서 채용된 람다는 강력한 기능들과 이해하기 쉬운 문법으로 무장하여 std::bind보다 더 좋은 선택이 되었다. 그리고 C++14에 와서는 람다는 std::bind의 완벽한 상위호환이 되었다.std::bind는 가독성이 떨어진다.std::bind보다 람다를 선호하는 가장 큰 이유중 하나는 바로 가독성이다. 시간에 맞춰 알람을 주는 함수를 만드는 예를 살펴보자.using Time = std::chrono::s.. 2015. 5. 19.
Modern Effective C++ Item 33 : 람다 forwarding엔 decltype 람다에서 std::forward 인자는 decltypec++14람다에서 가장 신통한 것은 바로 인자로 auto를 받는 generic lamdas이다. 람다에서 인자를 auto로 받는다는 것은 람다로 부터 나온 closure 클래스의 opearator( )가 템플릿이 된다고 볼 수 있다. 예를 들어 이런 auto를 인자로 받는 람다를 보자.auto f = [](auto x){ return func(normalize(x));};이 람다로 부터 나온 클로저 클래스는 다음과 같이 생겼다.class SomeCompilerGeneratedClassName{ public: template auto operator( )(T x) const { return func(normalize(x)); } ... }위 예제에서 람.. 2015. 5. 19.
Logging Logging우리들은 자주 로그를 찍는다, 또는 찍어라 하고 말한다. 로그를 찍는것은 시스템의 상황을 외부 저장소에 기록하는 것을 의미한다. 약속된 특정 조건에서 약속된 내용을 저장하여 문제나 운영 상황을 파악하기 쉽게 만들어 주는 역할을 한다. 앞서 말한 dump도 로그의 일종이라고 생각한다.Log Library로그를 찍어야한다. 처음 생각하기 쉬운 방법은 fprintf등으로 파일에 출력하기이다. 직접 정보를 쉽게 다룰 수 있다는 점은 좋다. 하지만 로그 파일을 안정적으로 다루는 것은 또 다른 문제이다. 추가로 동기적 I/O 형태의 호출이므로 성능이슈도 뒷따른다. 혹여 멀티쓰레드 프로그래밍을 해야된다면, fprintf를 쓸 마음이 점점 사라지게 될 것이다.그리고 일반적으로 로깅을 할 때 하나의 자료에만.. 2015. 5. 16.