나는 여러 번 읽었습니다.Linux용 토큰 버킷 필터(tbf)그리고 나는 아직도 계산 burst
과 latency
매개변수가 어떻게 수행되어야 하는지 완전히 이해하지 못합니다. 부끄러운 일입니다 :(
합리적인 지연 시간은 약 50밀리초 정도라고 생각합니다. 좋습니다. 하지만 버스트는 어떤 값을 취해야 할까요?
매뉴얼 페이지에는 다음과 같이 나와 있습니다.
후자의 계산에서는 버킷 크기, 속도 및 가능한 최고 속도(설정된 경우)를 고려합니다. 이 두 매개변수는 상호 배타적입니다.
그렇다면 지연 시간은 버킷 및 필터와 어떤 관련이 있습니까? 계산하는 공식이 있나요? 아니면 단지 "좋아요, X 바이트의 버스트와 Y 초의 지연이 나에게 좋습니다"라는 질문입니까?
답변1
맨페이지에서 유일한 제한 사항 burst
은 구성한 속도를 허용할 만큼 충분히 높아야 한다는 것입니다. 즉, 최소한 rate/HZ여야 합니다. HZ는 커널 구성 매개변수입니다. 커널 구성을 확인하여 시스템에 무엇이 있는지 알아낼 수 있습니다. 예를 들어 Debian에서는 다음을 수행할 수 있습니다.
$ egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y
따라서 내 시스템의 HZ는 250입니다. 10mbps를 달성하려면 burst
최소한 10,000,000비트/초 ¼ 250Hz = 40,000비트 = 5000바이트가 필요합니다. (맨 페이지의 더 높은 값은 기본값인 HZ=100에서 비롯됩니다.)
그러나 burst
이는 정책 도구이기도 합니다. 나중에 사용할 수 있도록 "저장"하기 위해 지금 사용할 수 있는 대역폭의 양을 구성합니다. 여기서 일반적인 문제는 대용량 다운로드를 제한하면서 작은 다운로드(예: 웹 페이지)를 매우 빠르게 실행하도록 허용하려는 것입니다. burst
다운로드 크기를 더 작다고 생각되는 크기로 늘리면 됩니다 . (그러나 다양한 트래픽 유형을 분류할 수 있도록 htb와 같은 클래스형 qdisc로 전환하는 경우가 많습니다.)
따라서 원하는 것을 달성할 수 있을 만큼 충분히 큰 버스트를 구성합니다 rate
. 그 외에도 달성하려는 목표에 따라 더 늘릴 수 있습니다.
토큰 버킷 필터의 개념 모델
"버킷"은 은유적인 대상입니다. 주요 기능은 토큰을 보유할 수 있다는 것이며 보유할 수 있는 토큰 수에는 제한이 있습니다. 더 많은 토큰을 추가하려고 하면 "오버플로"되어 초과 토큰이 손실됩니다(예: 용기에 물이 너무 많습니다.) 실제 버킷). 버킷의 크기를 이라고 합니다 burst
.
실제로 패킷을 네트워크로 전송하려면 패킷은 바이트 크기 또는 mpu
(둘 중 더 큰 것) 크기와 동일한 토큰을 얻어야 합니다.
토큰을 기다리는 패킷의 큐(queue)가 있습니다(또는 있을 수도 있습니다). 이는 버킷이 비어 있거나 토큰이 패킷 크기보다 작은 경우에 발생합니다. 배럴 앞 보도에는 이 정도의 공간만 있고, 공간의 양(바이트)은 직접 설정됩니다 limit
. 또는 간접적으로 설정할 수도 있습니다 (이상적인 경우 × latency
로 평가됨 ).rate
latency
커널이 필터링된 인터페이스에서 패킷을 보내려고 하면 패킷을 줄 끝에 배치하려고 합니다. 보도에 공간이 없으면 보도의 끝이 바닥이 없는 구덩이이고 커널이 패킷을 삭제하기 때문에 이는 패킷에 불행한 일입니다.
마지막 부분은 매 주기마다 버킷에 토큰을 추가 rate
/ 토큰을 만드는 토큰 메이커입니다. HZ
(이것이 버킷이 최소한 이 정도 커야 하는 이유입니다. 그렇지 않으면 새로 생성된 토큰 중 일부가 즉시 폐기됩니다.)
답변2
DeRobert의 답변에 또 다른 추가 사항입니다.
첫째, 최신 Intel CPU에 대한 매뉴얼은 오래되었습니다. 최신 CPU에는 고해상도 타이머가 있는 반면 최신 Linux에는 틱이 없습니다. 문자 그대로 타이머 틱이 없습니다. 따라서 타이머에 토큰을 담을 수 있을 만큼 버킷을 크게 만드는 것에 대한 모든 설명은 부적합합니다. 실제로 버킷 비유는 사용자가 타이머 세분성과 전송 속도 간의 상호 작용을 이해하는 데 도움을 주기 위한 것입니다. 이제 Linux에는 최신 하드웨어에 나노초 타이머가 있으므로 유용성이 상실되었습니다.
TBF용터지다매개변수는 속도 제한이 적용되기 전에 속도 제한 없이 전송할 수 있는 바이트 수입니다(다음과 같이 제공됨).속도) 효력이 발생합니다. 속도 제한이 적용되면 또 다른 버스트를 얻을 수 있는 유일한 방법은 전송을 해당 속도 이하로 제한하는 것입니다.
예를 들어, 당신의 tbf가터지다매개변수는 10K 바이트입니다.속도매개변수는 2K 바이트/초이며 현재 속도가 제한되어 있습니다(즉, 버스트가 소진되어 2kbps로만 보낼 수 있음). 10초 동안 자발적으로 전송 속도를 1Kbps로 줄이면 다시 10K 바이트 버스트 제한(= (2000[바이트/초] - 1000[바이트/초]) * 10초)이 누적됩니다. 10초 이상 1kbps 미만으로 유지하면 tbf는 다음 이상의 축적을 허용하지 않으므로 아무런 효과가 없습니다.터지다범위.
지출을 완전히 중단하면 5초(= 100000[바이트] / 2000[바이트/초]) 이내에 버스트 허용량을 다시 받게 됩니다.
갑자기 적립금을 모두 인출할 필요 없이 적립된 금액만 사용하시면 됩니다.
이를 보는 또 다른 방법은 다음과 같습니다.터지다무제한 속도 바이트, 이후에는 장기 평균 속도가 절대 초과되지 않습니다.속도. 다만, 장기평균이므로 그 이하라면속도최고 속도로 보내면 따라잡을 수 있지만, 그래도 최고 속도로 보내는 것이 최선입니다.터지다바이트(따라잡을 수 없으면 따라잡을 수 없습니다).
또 다른 문제는 TBF가둘이러한 속도 제한기와 트래픽은 두 속도 제한기를 모두 통과해야 합니다. 두 번째에서는 버스트 매개변수가 호출됩니다.최대 전송 단위그리고 이 비율을 이라고 합니다.최고 요금. 첫 번째 것이 버스트를 전송할 수 있는 속도를 제한하려면 두 번째 것을 사용해야 합니다. 두 번째 것을 사용하는 것은 선택 사항입니다. 사용하지 않으면 버스트가 장치 속도로 전송됩니다.
마지막으로 tbf에는한계범위. 프로그램이 계속해서 더 빠르게 전송하는 경우속도, 패킷은 대기열에 누적됩니다. 커널 메모리에는 무제한이 없으므로한계커널이 패킷 삭제를 시작하기 전에 구축할 수 있는 바이트 수를 나타냅니다.