이것은 기본적으로 p2p 채팅 네트워크에서 패킷 수를 계산하고 패킷 유형 등을 계산하는 로깅 / 카운팅 응용 프로그램입니다. 이는 5 분 동안 약 4-6 백만 패킷에 해당합니다. 이 정보의 "스냅 샷"만 가져 오기 때문에 5 분마다 5 분보다 오래된 패킷 만 제거합니다. 따라서이 컬렉션에 포함될 최대 항목 수는 1 천 1 백만에서 1 천 2 백만입니다.
다른 수퍼 피어에 300 번 연결해야하므로 각 패킷이 300 번 이상 삽입 될 가능성이 있습니다 (이 데이터를 메모리에 보관하는 것이 유일한 합리적인 옵션 일 수 있습니다).
현재이 정보를 저장하기 위해 사전을 사용하고 있습니다. 그러나 저장하려는 항목이 많기 때문에 큰 객체 힙에 문제가 발생하고 시간이 지남에 따라 메모리 사용량이 지속적으로 증가합니다.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
mysql을 사용해 보았지만 삽입 해야하는 양 (데이터가 중복되지 않았는지 확인하는 동안)을 처리 할 수 없었으며 트랜잭션을 사용하는 동안이었습니다.
나는 mongodb을 시도했지만 그 CPU 사용량은 미쳤으며 유지하지 못했습니다.
5 분보다 오래된 모든 패킷을 제거하고이 데이터의 "스냅 샷"을 작성하기 때문에 5 분마다 주요 문제가 발생합니다. LINQ 쿼리를 사용하여 특정 패킷 유형을 포함하는 패킷 수를 계산합니다. 또한 데이터에 대해 distinct () 쿼리를 호출하여 키 값 쌍의 키에서 4 바이트 (ip 주소)를 제거하고 키 값 쌍의 Value에서 요청 포트 값과 결합하여 고유 한 수를 얻습니다. 모든 패킷에서 피어.
응용 프로그램은 현재 약 1.1GB의 메모리 사용량을 차지하며 스냅 샷이 호출되면 사용량을 두 배로 늘릴 수 있습니다.
이제 엄청난 양의 램이 있으면 문제가되지 않지만 현재 실행중인 vm은 현재 2GB의 램으로 제한됩니다.
쉬운 해결책이 있습니까?