Açık kaynaklı Çin OSC manşetlerine dikkat edin ve en son teknik bilgileri alın
Çoğullama aslında yeni bir teknoloji değildir, işlevi, tek bir iletişim bağlantısı temelinde aynı anda birden çok istek ve yanıtı işlemektir. Ağ iletişimi için böyle bir argüman yoktur, çünkü ağ katmanı yalnızca veri aktarımından sorumludur; üst katman uygulama protokollerinin formülasyonu nedeniyle, birçok geleneksel hizmet çoğullamayı destekleyemez; örneğin: http1.1, sqlserver ve redis, vb. vb. Bazı hizmetler toplu işleme sunsa da, bu işlemlerin tümü tek bir RPS'ye dayalıdır. Aşağıdaki diyagramlar, tek kanallı ve çoğullama arasındaki farkı açıklamaktadır.
Tek yönlü problemler
Her istek yanıtı tek bir bağlantı işgal eder ve bağlantı ağı okur ve yazar; bu, bağlantının uzun süre boşta kalmasına ve ağ kaynaklarından daha iyi yararlanamamasına neden olur. Özel okuma ve yazma IO'su nedeniyle, RPS işlem hacmi IO tarafından karşılanmalıdır ve IO işlemi performansı tüketir, böylece yüksek RPS işlemede performans sorunları ortaya çıkar. IO'nun etkin bir şekilde birleştirilememesi, özellikle nispeten küçük istek paketleri için iletişimde bant genişliğinin boşa harcanmasına da yol açar. İletişimde gecikme Çok sayıda RPS gerektiğinde, daha fazla bağlantının desteklenmesi gerekir ve bağlantı sayısındaki artış da kaynak yükünü artırır.
Çoğullamanın Avantajları
Çoğullama, aynı anda bir bağlantıda birden çok istek yanıtını işleyebilir, bu da bağlantı sayısını büyük ölçüde azaltabilir ve ağın işleme kapasitesini artırabilir. Paylaşılan bir bağlantı olduğu için, farklı istek ve yanıt paketleri, işleme için tek bir GÇ'de birleştirilebilir; bu, GÇ'nin işlem hacmini büyük ölçüde azaltabilir ve performansı daha iyi hale getirebilir.
Çoğullama yoluyla milyonlarca RPS elde etme
Çoğullama gerçekten bu kadar iyi mi?Aşağıda, tek bir hizmet milyon RPS çıktısı elde etmek için .net çekirdeğinde çoğullama kullanılır ve nispeten düşük gecikme süresi elde edilebilir. Aşağıdaki test akışıdır:
Temel iletişim, mesaj paketi birleştirme işlevine sahip olmadığı için entegrasyon testi BeetleX bazında yapılır.Temel olarak, BeetleX mesajları otomatik olarak bir Tamponda birleştirir, böylece IO'nun okuma ve yazma işlemlerini azaltır.
Test mesajı yapısı
Bu test, temel etkileşim mesajı olarak Protobuf'u kullanır, sonuçta Protobuf zaten bir ikili serileştirme standardıdır.
istek mesajı
public int kimliği { get; set; } public Double RequestTime { get; set; }yanıt mesajı
public int Çalışan Kimliği { get; set; } public string Soyadı { get; set; } public string FirstName { get; set; } public string Adres { get; set; } public string Şehir { get; set; } public string Bölge { get; set; } public string Ülke { get; set; } public Double RequestTime { get; set; }**Sunucu işleme kodu**
public static void Response(Tuple < IServer, ISession, SearchEmployee > değer) { Çalışan em = Employee.GetEmployee(); emp.RequestTime = value.Item3.RequestTime; value.Item1.Send(emp, value.Item2); System.Threading.Interlocked.Increment(ref Count); } genel geçersiz kılma geçersiz SessionPacketDecodeCompleted(IServer sunucusu, PacketDecodeCompletedEventArgs e) { SearchEmployee emp = (SearchEmployee)e.Message; multiThreadDispatcher.Enqueue(yeni Tuple < IServer, ISession, SearchEmployee > (sunucu, e.Oturum, emp)); }Hizmet yanıtı nesne içeriği
Çalışan sonucu = yeni Çalışan(); sonuç.ÇalışanKimliği = 1; sonuç.LastName = "Davolio"; sonuç.FirstName = "Nancy"; sonuç.Adres = "ja"; sonuç.Şehir = "Seattle"; sonuç.Bölge = "WA"; sonuç.Ülke = "ABD";Mesaj alındıktan sonra kuyruğa alınır ve daha sonra yanıt kuyruk tarafından işlenir, talebin karşılık gelen istek süresi ayarlanır ve işlenen toplam mesaj sayısı kaydedilir.
müşteri istek kodu
özel statik geçersiz Yanıt (Tuple < AsyncTcpClient, Çalışan > veri) { System.Threading.Interlocked.Increment(ref mCount); if (mCount > 100) { if (data.Item2.RequestTime > 0) { çift tik = mWatch.Elapsed.TotalMilisaniye - data.Item2.RequestTime; AddToLevel(onay); } } var s = new SearchEmployee(); s.RequestTime = mWatch.Elapsed.TotalMilisaniye; data.Item1.Send(ler); }İstemci Testi Başlatma Kodu
for (int i = 0; ben < mBağlantılar; i++) { var client = SocketFactory.CreateClient < BeetleX.Clients.AsyncTcpClient, TestMessages.ProtobufClientPacket > (mIPAdresi, 9090); client.ReceivePacket = (o, e) = > { Çalışan = (Çalışan)e; multiThreadDispatcher.Enqueue(yeni Tuple < AsyncTcpClient, Çalışan > ((AsyncTcpClient)o, emp)); }; client.ClientError = (o, e) = > { Console.WriteLine(e.Mesaj); }; mClients.Add(istemci); } for (int i = 0; ben < 200; ben++) { foreach (mClients'ta var öğesi) { SearchEmployee araması = yeni SearchEmployee(); Görev.Çalıştır(() = > { item.Send(ara); }); } }Testin tamamı 10 bağlantı açar ve istekler ve yanıtlar bu 10 bağlantı temelinde çoğullanır.
Test yapılandırması
Test ortamı iki sunucudur ve yapılandırma Alibaba Cloud üzerinde 12 çekirdekli bir sunucudur (ilgili fiziksel makine 6 çekirdek ve 12 iş parçacığı olmalıdır)
Hem hizmet hem de istemci sistemleri şunlardır: Ubuntu 16.04
Dotnet çekirdek sürümü: 2.14
Test sonuçları
Müşteri İstatistikleri
Sunucu İstatistikleri
Bant Genişliği İstatistikleri
Test, çoğullama için 10 bağlantı kullanır, saniyede alınan yanıt hacmi 100 W'dir ve çoğu yanıt gecikmesi 1-3 milisaniye arasındadır.
Blog Yazarı: Mud Shui Guy
Günlük blog sütunu, her gün sizin için mükemmel blog yazarlarından yüksek kaliteli teknik makaleler önerir. Aynı zamanda, kullanıcılar katkıda bulunabilirler.Makale resmi hesaba eklendiğinde, web sitesinin ana sayfasında ve diğer yerlerde tavsiye edeceğiz. Her gün yüksek kaliteli anında iletme bildirimleri almak için Açık Kaynak Çin OSC'yi takip edin, " daha fazla bilgi edin "Orijinal makaleyi okuyun ve test kodunu indirin.