2009-11-09 5 views
8

나는 밤 시간대에 데이터를주고 받음으로써 3 개 시간대에 걸쳐있는 많은 장치에 서비스를 제공하는 환경을 가지고 있습니다. 이러한 장치의 분포는 모듈 번호 연산을 사용하여 식별 번호와 간단한 계산을 기반으로 의사 무작위로 결정되었습니다. 이러한 계산의 결과로 특정 시간 동안 원하는 것보다 많은 리소스를 소비하는 불필요한 인공 피크가 생성됩니다.시간이 지남에 따라 피크 사용량을 병합하는 알고리즘?

우리 프로토콜의 일부로 다음 날 밤에 시스템에 연결할 때 장치에 지시 할 수 있습니다.

피크를 더 많은 레벨 라인 (일반적으로 더 높거나 많음)으로 또는 적어도 올바른 방향으로 밀어 넣을 수있는 알고리즘을 찾고 있습니다 - 어떤 종류의 용어를 읽어야합니까? . 나는 장치의 식별 번호, 현재 시간 및 장치의 시간대를 계산 수행을위한 입력으로 사용할 수 있습니다. 또한 앞의 분석 계산을 수행하여 슬롯을 그리는 풀을 만들 수도 있지만,이 방법이 내가 바라는 것보다 덜 우아 할 수도 있지만 (학습 알고리즘이 나쁜 것은 아니지만 ...).

(궁극적으로 다소 덜 나는. C#을 사용이 알고리즘을 구현한다 관련) 당신은 연결하는 어떤 시간 장치를 알 수 있다고

+0

내가 완전히 분명 문제의 설명을 찾을 수 없습니다 :

방법은 다음과 같습니다 구현하는 다양한 기능에 대한 좀 더 구체적인 정보는입니까? 우리는 무엇을 배포하고 있습니까? 어떻게 (어느 정도) 무작위 분포가 중요한 피크를 가져올 수 있습니까? 그 대신 배포본이 간단한 라운드 로빈 일 경우 어떻게 될까요? – djna

+0

시간대 및 모듈러스 작동으로 인위적으로 피크가 생성됩니다. – cfeduke

답변

12

임의 시간 사용과 관련된 스파이크를 피하려면 해시 테이블에 사용되는 다양한 해싱 함수를 살펴보십시오. 당신의 독서는 주제에 위키 피 디아 기사에서 시작 수 있습니다

기본적으로

http://en.wikipedia.org/wiki/Hash_function

, 당신이 당신의 업데이트 창 버킷 적절한 수의에로 원하는대로 나눈다. 하나의 옵션은 3 시간 * 60 분 * 60 초 = 10800 버킷 일 수 있습니다. 그런 다음 선택한 해시 함수에 대해 해시 테이블 크기로 사용하십시오. 고유 입력은 장치 ID 일 수 있습니다. 선택한 시간에 GMT를 사용하는 것을 잊지 마십시오. 선택한 프로그래밍 언어에는 해시 함수가 내장되어 있지만 문서에서 처음부터 구현하려는 경우 시작할 링크가 있어야합니다.

이 접근법은 훨씬 좋은 균일 성질을 가지고 있기 때문에 이전의 랜덤 액세스 시간보다 뛰어납니다. 은 가끔씩 스파이크를 나타낼 가능성이있는 랜덤 함수와 비교하여 액세스 패턴이 대략 편평한을 보장합니다. .

http://www.partow.net/programming/hashfunctions/index.html

2

, 그래서 당신은 무작위로 또는 modulused 아무것도 필요 왜 표시되지 않습니다. 각 장치가 연결될 때 현재 할당 된 장치가 많지 않은 내일을 선택하고 해당 시간에 장치를 할당하십시오. 장치가 모두 동일한 양의 자원을 사용하여 서비스한다면, 사소한 탐욕 알고리즘은 완전히 매끄러운 분배를 생성하여 각 장치를 현재 혼잡이 가장 적은 시간에 할당합니다. 서버가 이러한 장치 이외의 다른 작업을 처리하는 경우 일반적인로드 프로필로 시작한 다음 장치로드를 추가해야합니다. 나는이 "분석적 계산"이라고 부르지 않고 다음 24 시간 동안 예상되는로드의 히스토그램을 저장합니다.

또는 기기가 지침에 따르지 않을 수도 있습니다 (예 : 할당 된 시간에 오프라인 일 수 있으며 다음에 접속할 때마다 연결될 수 있음). 분명히 특정 시간대에있는 사용자가 모두 아침에 같은 시간에 작업을 시작한다면 이는 문제가되는 전략입니다.

+0

문제는 피드백 루프 구성 요소가 있다는 것입니다. 첫날밤에 2am가 가장 바쁜 일이 발생하면 2am에 자원을 할당합니다. 부차적 인 트래픽이 첫날 밤에 무작위로 할당되면 2am이 가장 바쁠 것입니다. 그러면 오전 2 시부 터 모든 것을 예약하여 2am 경을 비효율적으로 사용하게됩니다. 부수적 트래픽의 안정적인 분배가 가능하지 않으면 간격을 통한 균일 한 할당이 항상 최적이됩니다. – groundhog

+0

현재 가장 바쁜 시간 (예 : 150 만 히트)이 오전 1 시이고, 가장 바쁜 시간 (예 : 0.5 백만 히트)이 2 시간이라면, 내 제안은 앞으로 오전 2시에 1 암 히터 중 50 만 명에게 히트 할 것을 제안하는 것입니다. 이것은 피드백 루프가 어떻게 나타나는지 보지 못합니다 : 정수가 들어있는 버킷 배열을 유지하십시오. "내일이 시간에 얼마나 많은 히트가 예약 될 것입니까?"그리고 그 버킷들을 균일하게 채우십시오. 결함이있는 알고리즘을 사용하지 않는 이상 과도한 보상은 없습니다. "이미 다른 시간에서 이미 이동 한 것을 포함하여 *이 시간에 예약 된 히트 수 *." 그러지 마라. –

1

장치 수를 취하고 시간 간격을 n 개의 동일한 세그먼트로 나누고 각 세그먼트를 장치에 할당하여 다음에 연결할 때 연결시기를 알립니다.

이렇게하면 모든 경우에 최적의 균일 한 분포가 제공됩니다.

GMT로 표준 시간대를 정규화하십시오. 시간대 또는 낮 절약 시간 등에 대해 무엇을 신경 쓰시겠습니까? 이제는 현재 시간대에 상관없이 적용됩니다.

무작위 배포를 추가하면 덩어리로 이어질 수 있습니다 (일정한 무작위 배포는 한도 내에서만 동일하지만 특정 샘플에서는 필요하지 않음). 피드백 메커니즘이없는 경우에 사용됩니다. 임의의 구성 요소를 연결할 때 어느 정도 제어 할 수 있기 때문에 원격 조정이 필요하지 않으며 원격으로도 최적이 아닙니다.

임의의 장치에서 시계 드리프트가 걱정된다면 임의성을 추가해도 클록 드리프트가 임의적으로 줄어들지 않으며 최적의 할당이되지 않을 수도 있습니다.

지역별로 장치를 안정적으로 배포하려면 지역별 장치 비율을 계산하고 슬롯 할당을 적절하게 분배하십시오.예를 들어 시간대별로 50/25/25가있는 경우 첫 번째 시간대에 슬롯을 할당 한 다음 나머지 두 시간대에 다음 슬롯을 할당 한 다음 반복합니다.

관련 문제