2013-05-16 17 views
5

Linux ağında yoğun bir ağ uygulaması geliştirmek için, ne tür bir mimari tercih edilir? Bu uygulama, bu uygulamanın genellikle birden fazla çekirdek (sanal veya fiziksel) içeren makinelerde çalıştırılacağıdır. Performansın temel kriter olduğunu düşünürsek, çok iş parçacıklı bir uygulamaya mi yoksa çoklu süreç tasarımına mı sahip olmak daha iyi olur? Kaynakların paylaşımı ve senkronizasyonun, birden fazla süreçten bu kaynaklara erişilmesi için bir çok program yükü olduğunu bilmekteyim, ancak daha önce de belirtildiği gibi, genel performans temel gereksinimdir ve bu yüzden bunları görmezden gelebiliriz. Ve programlama dili C/C++ olacaktır.performans - çok iş parçacıklı ya da çok işlemli uygulamalar

Çok iş parçacıklı uygulamaların (tek işlem) bile birden çok çekirdekten yararlanabileceğini ve her bir iş parçacığını bağımsız olarak farklı bir çekirdek üzerinde çalıştırabileceğini duydum (senkronizasyon sorunu olmadığı sürece). Ve bu zamanlama çekirdek tarafından yapılır. Öyleyse, çok iş parçacıklı uygulamalar ve çok işlemli uygulamalar arasında performansta fazla bir fark yok mu? Nginx çok işlemli bir mimariyi kullanıyor ve gerçekten hızlı, ancak çok iş parçacıklı uygulamalarla aynı performansı elde edebilir mi?

Teşekkürler.

cevap

3

Linux'taki süreçler ve iş parçacıkları birbirine çok benzer - temel fark, tüm sanal belleğin yanı sıra sinyal işleme gibi bazı şeylerin paylaşılmasıdır.

Bu, iş parçacıkları arasında daha ucuz bir içerik geçişi sağlar (pahalı MMU yeniden yüklemelerine gerek yoktur), ancak hızda (özellikle iş parçacığı oluşturma dışında) çok fazla fark yaratmaz. yüksek ağ yoğun uygulama tasarlama için

temelde sadece çözüm bir evented mimarisini kullanmaktır (aksi takdirde süreçler/parçacığı büyük miktarda sistem çıkmaza ve aslında çalışan daha kendi yönetimi üzerinde daha fazla zaman harcayacağınız çalışma kodu), soketlerde I/O'ya tepki verdiğinizde ve hangi soketlerin etkinlik gösterdiğine bağlı olarak uygun işlemler yapılır.

gibi durumlarda karşılaşılan sorunlar hakkında Ünlü writeup http://www.kegel.com/c10k.html edinilebilir "C10k sorun", - biraz tarihli olmasına rağmen çok iyi bir giriş olduğunu bu yüzden, farklı I/O yaklaşımlarını açıklar.

Reaktör benzeri tasarımlara derinlemesine atmadan önce dikkatli olun - bunlar hantal ve karmaşık olabilirler, bu yüzden üzerinde daha güzel bir soyutlama sağlayan kitaplık/dil kullanamıyorsanız bakın (Erlang benim buradaki kişisel favorimdir) Go gibi koroutine sahip diller de yararlı olabilir).

+0

@ p-l: Cevabınız için teşekkürler. Evet, plan eşit tabanlı mimariyi kullanmak ve ağ olaylarına dayanarak hareket etmektir. Ve çalışma zamanı boyunca ek iş parçacığı ve süreç oluşturulmaz. Bu, çok iş parçacıklı ve çok işlemli uygulamalar arasında performans farkı görmüyor musunuz? Örneğin: 4 çekirdekli bir sistem varsa, her iki mimarın arasında performans açısından fark edilir bir fark olmayacaktır. – sthustfo

+0

Mümkün olan en büyük farklılıklar, zamanlamada olacaktır ve bu, görevin cpu benzeşimi ile değiştirilebilir ve her bir görevi (iş parçacığı/işlem) belirli bir cpu ile sabitler. Sunucu işlemiyle yapılan gerçek çalışmadan ve ağ bölümüyle nasıl etkileşime girdiğinden daha fazla farklılık olabilir. Belleğe erişim ile ilgili farklılıklar olabilir, ancak NUMA sisteminde genel olarak bellek paylaşımıyla ilgili iş parçacığı/işlem farklılığıyla daha az ilgili olabilir. Ancak, mevcut çekirdeklerin farklı NUMA kod parçalarının kopyalarını yapmalarına destek olabilir. bölgeler (geçmişte çekirdeğin kendisi için var). –

1

Eğer iş parçacığınız işi birbirinden bağımsız yapıyorsa, linux altında bunun yerine birden çok işlem yapmamanın bir nedeni yoktur. Her işlemin kendi özel bellek alanı olduğundan, birden fazla işlem bellek kullanımınızı artıracaktır, ancak diğer yandan bağımsız iş parçacıkları arasındaki bellek alanını paylaşmanız daha kötü bir karardır. Süreçler ve süreçler arasındaki bağlam değişimi genellikle biraz mimarisi ve kod bağımlı olmasına rağmen iş parçacıkları yerine süreçler için daha iyi yapılır. İşlemler, kilitler ve mutekslerle serileştirilmekten güvenlidir. Linux'ta süreçlerin yönetimi ve etkileşimi daha kolaydır. Burada ilginç bulabileceğiniz iyi bir belge (http://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf).

+0

Belgeye yapılan referans için teşekkürler, çok yararlı. İş parçacıklarının çok daha hızlı algılanmasının, yalnızca yığınları çoğaltan ve başlangıçta hem çocuk hem de ebeveyn işleminin aynı bellek bölümlerini paylaştığı Linux çatalı gibi, tüm işlemleri sıfırdan oluşturacak olan Windows ortamlarından kaynaklandığına inanıyorum. Bir yürütme çağrısı yapılmadıkça bu kodun tüm alt süreçler ve ebeveynler arasında paylaşılmaya devam ettiğini düşünüyorum. – CyberFonic

İlgili konular