일부 StatsD 및 DogStatsD 클라이언트는 기본적으로 데이터그램당 하나의 메트릭을 전송합니다. 이로 인해 클라이언트, 운영 체제 및 에이전트에 상당한 오버헤드가 추가됩니다. 클라이언트가 하나의 데이터그램에 여러 메트릭 버퍼링을 지원하는 경우 이 옵션을 활성화하면 눈에 띄게 개선됩니다.
버퍼링을 지원하는 커뮤니티 지원 DogStatsD 클라이언트를 사용하는 경우, 에이전트 측의 데이터그램당 버퍼 크기 (기본값 8KB, dogstatsd_buffer_size를 사용해 에이전트에서 설정 가능)와 네트워크/OS 최대 데이터그램 크기를 초과하지 않는 최대 데이터그램 크기를 설정해야 합니다.
기본적으로 Datadog의 공식 Golang 라이브러리 DataDog/datadog-go는 버퍼링을 사용합니다. 각 패킷의 크기와 메시지 수는 UDS와 UDP에 대해 서로 다른 기본값을 사용합니다. 클라이언트 설정에 대한 자세한 내용은 DataDog/datadog-go을 참조하세요.
packagemainimport("log""github.com/DataDog/datadog-go/v5/statsd")funcmain(){// 이 예제에서는 메트릭이 UDP에 대한 올바른 기본 설정으로 버퍼링됩니다.
statsd,err:=statsd.New("127.0.0.1:8125")iferr!=nil{log.Fatal(err)}statsd.Gauge("example_metric.gauge",1,[]string{"env:dev"},1)}
아래 예제에서는 Datadog의 공식 Python 라이브러리 datadogpy를 이용해 최소 패킷 수로 메트릭을 전송하는 버퍼링된 DogStatsD 클라이언트를 사용합니다. 버퍼링을 사용하면 패킷 크기 제한에서 300 밀리초마다 (설정 가능) 자동 플러싱이 수행됩니다.
fromdatadogimportDogStatsd# 클라이언트 v0.43.0+를 사용하는 경우dsd=DogStatsd(host="127.0.0.1",port=8125,disable_buffering=False)dsd.gauge('example_metric.gauge_1',123,tags=["environment:dev"])dsd.gauge('example_metric.gauge_2',1001,tags=["environment:dev"])dsd.flush()# Optional manual flush# v0.43.0 이전 클라이언트를 사용하는 경우, 버퍼링을 사용하려면 컨텍스트 관리자가 필요합니다.dsd=DogStatsd(host="127.0.0.1",port=8125)withdsd:dsd.gauge('example_metric.gauge_1',123,tags=["environment:dev"])dsd.gauge('example_metric.gauge_2',1001,tags=["environment:dev"])
기본값으로 파이썬(Python) DogStatsD 클라이언트 예시(statsd 글로벌 예시 포함)는 프로세스 간에 공유할 수 없지만 스레드 안전 상태입니다. 따라서 상위 프로세스와 각 하위 프로세스는 클라이언트의 고유한 예시를 생성하거나 disable_buffering을 True로 설정하여 버퍼링을 명시적으로 해제해야 합니다. 자세한 내용은 datadog.dogstatsd의 설명서를 참조하세요.
아래 예제는 Datadog의 공식 Ruby 라이브러리 [dogstatsd-ruby][1]를 사용합니다. 플러시가 트리거될 때 하나의 패킷으로 메트릭을 전송하는 버퍼링된 DogStatsD 클라이언트 인스턴스를 생성합니다:
아래 예제에서는 Datadog의 공식 Java 라이브러리 java-dogstatsd-client를 사용하여 최대 패킷 크기가 1500바이트인 버퍼링된 DogStatsD 클라이언트 인스턴스를 생성합니다. 즉, 이 클라이언트 인스턴스에서 전송되는 모든 메트릭은 버퍼링되고 최대 1500 패킷 길이의 패킷으로 전송됩니다:
아래 예제는 Datadog의 공식 C# 라이브러리 dogstatsd-csharp-client를 사용하여 UDP를 트랜스포트로 사용하는 DogStatsD 클라이언트를 생성합니다:
usingStatsdClient;publicclassDogStatsdClient{publicstaticvoidMain(){vardogstatsdConfig=newStatsdConfig{StatsdServerName="127.0.0.1",StatsdPort=8125,};using(vardogStatsdService=newDogStatsdService()){if(!dogStatsdService.Configure(dogstatsdConfig))thrownewInvalidOperationException("DogstatsD를 초기화할 수 없습니다. 자세한 내용을 위해 `Configure` 방식에서 optionalExceptionHandler 인수를 설정하세요.");// Counter and Gauge are sent in the same datagramdogStatsdService.Counter("example_metric.count",2,tags:new[]{"environment:dev"});dogStatsdService.Gauge("example_metric.gauge",100,tags:new[]{"environment:dev"});}}}
아래 예제는 Datadog의 공식 PHP 라이브러리 php-datadogstatsd를 사용하여 블록이 완료될 때 하나의 패킷으로 메트릭을 전송하는 버퍼링된 DogStatsD 클라이언트 인스턴스를 생성합니다:
클라이언트에 대한 샘플 속도 값을 설정하여 DogStatsD 클라이언트에서 에이전트로 전송되는 트래픽을 줄일 수 있습니다. 예를 들어, 0.5의 샘플 속도는 전송된 UDP 패킷 수를 절반으로 줄입니다. 이 솔루션은 트래픽을 줄이되 정밀도와 세분성이 약간 떨어질 수 있다는 단점이 있습니다.
에이전트 및/또는 DogStatsD를 배포하기 위해 쿠버네티스를 사용 중이고 위에서 언급한 대로 sysctls를 설정하려면 컨테이너별로 값을 설정합니다. net.* sysctls가 네임스페이스인 경우, 포드별로 설정할 수 있습니다. 쿠버네티스 클러스터에서 sysctls 사용하기를 참조하세요.
적절한 크기의 패킷을 DogStatsD 에이전트의 DogStatsD 서버로 전송하여 추가 CPU 사용을 방지하세요. 최신 버전의 공식 DogStatsD 클라이언트는 성능에 최적화된 크기의 패킷을 전송합니다.
최신 Datadog DogStatsD 클라이언트 중 하나를 사용하는 경우 이 섹션을 건너뛸 수 있습니다.
전송된 패킷이 너무 작은 경우, Datadog 에이전트는 여러 개의 패킷을 함께 묶어 나중에 파이프라인에서 일괄 처리합니다. 공식 DogStatsD 클라이언트는 패킷당 메트릭 수의 최적 비율을 갖도록 메트릭을 그룹화할 수 있습니다.
DogStatsD 클라이언트가 dogstatsd_buffer_size 크기의 패킷을 전송하는 경우 Datadog 에이전트가 가장 최적의 성능을 발휘합니다. 패킷이 버퍼 크기보다 작아야 에이전트가 메트릭 손상 없이 패킷을 버퍼에 완전하게 로드할 수 있습니다. DogStatsD 클라이언트에서 해당 설정 필드를 사용하세요.
UDP에 대한 참고 사항: UDP 패킷은 일반적으로 이더넷과 IP 계층을 통과하기 때문에 패킷 크기를 네트워크의 단일 이더넷 프레임보다 작은 값으로 제한하면 IP 패킷 조각화를 방지할 수 있습니다. 대부분의 경우 IPv4 네트워크는 1500바이트의 MTU로 설정되므로 이 경우 전송되는 패킷의 크기는 1472로 제한해야 합니다.
UDP에 대한 참고 사항: 최상의 성능을 위해 UDS 패킷 크기는 8192바이트여야 합니다.
에이전트는 DogStatsD 클라이언트가 전송하는 메트릭 버스트를 흡수하기 위해 메모리를 사용해야 합니다. 비록 이것이 짧은 시간 동안이고 이 메모리가 OS로 빠르게 해제되더라도, 스파이크가 발생하며 이는 메모리 사용량 제한으로 인해 포드나 컨테이너를 퇴거시킬 수 있는 컨테이너화된 환경에서 문제가 될 수 있습니다.
애플리케이션에서 메트릭을 버스트로 전송하지 마세요. Datadog 에이전트가 최대 메모리 사용량에 도달하는 것을 방지할 수 있습니다.
최대 메모리 사용량을 제한하기 하기 위한 또 다른 방법은 버퍼링을 줄이는 것입니다. 에이전트 내 DogStatsD 서버의 기본 버퍼는 dogstatsd_queue_size 필드를 사용하여 설정할 수 있으며 (Datadog 에이전트 6.1.0부터 가능), 기본값 1024는 대략적인 최대 메모리 사용량인 768MB를 유도합니다.
텔레메트리를 활성화 또는 비활성화하려면 disable_telemetry 인수를 사용합니다. 주의할 것은,
DogStatsd 클라이언트와 텔레메트리를 함께 사용하면 네트워크 사용량이 크게 증가합니다.
따라서, 텔레메트리 사용 시 BatchedDogStatsd를 사용하는 것이 좋습니다.