İş parçacıkları sanal bellek veya gerçek bellek kullanıyor mu?


10

Şu anda sadece 382 yaparken Linux sunucumu işlem başına 10.000 iş parçacığı işlemek için optimize etmeye çalışıyordum. Başı olarak bu makalede aşağıdaki formül toplam olası parçacığı bulmak için kullanılır:

number of threads = total virtual memory / (stack size*1024*1024)

Bu, iş parçacıklarının tüm verilerini sanal bellekte sakladığı anlamına gelir. Bildiğim kadarıyla, sanal bellek, sabit diskte RAM veya önbellekten daha fazla saklanan bir Linux makinesinde takas alanıdır.

Bu yüzden sorum şu ki, iş parçacıkları, verilerini işlemek / depolamak için sabit disk kullanıyor mu?

Evet ise, bu performansı etkilemez mi? RAM veya önbellek koyarak performansı artırabilir miyiz? Nasıl?

Yanıtınız hayırsa, iş parçacıkları tam olarak nasıl çalışır?

Güncelleme:

Göre en yararsız cevap , sanal bellek kabaca içeren bir sistemdir:

  • fiziksel bellek (RAM)
  • eklediğiniz takas dosyaları
  • sanal bellek, fiziksel adreslere çevrilip fiziksel bellekte sanal adres bulunmadığında sayfa hataları yayınlamak için donanım desteği
  • (çekirdek) yazılım desteği: bu donanım tarafından kullanılan arama tablolarını, isteğe bağlı olarak değiştirilen sayfalardan çekerek bu sayfa hatalarını yönetme

Bu nedenle, sanal bellekte bulunan her şey toplu olarak RAM (Gerçek Bellek) ve Sabit Disk (Dosya Değiştirme) üzerindedir. James'in cevabında açıkladığı gibi Ram vs HDD hakkındaki karar, LRU gibi algoritmalar kullanılarak Kernel tarafından alınır.


2
Sunucunuzda 10.000 CPU / Çekirdek yoksa zamanınızı boşa harcıyorsunuz demektir.

@JarrodRoberson: Neden böyle?
dragosrsupercool

3
10.000 iş parçacığı şeyleri ölçeklendirmek için iyi bir yol değildir, bir sunucuyu taramaya getirmek için iyi bir yoldur, CPU veya Core başına 1'den fazla iş parçacığı sadece sunucu bağlamını değiştirecek ve daha yavaş çalışacak şekilde hızlanmayacaktır.

Özellikle, "Linux sunucumu optimize etmeye çalışıyor" dediğinizde - neyi optimize etmeye çalışıyorsunuz? Verim ise, CPU başına çoklama ve engellemeyen G / Ç içeren bir iş parçacığının daha iyi olması muhtemeldir.
Yararsız

Yanıtlar:


12

Bildiğim kadarıyla, sanal bellek bir Linux makinesinde takas alanıdır

Hayır, sanal bellek kabaca aşağıdakileri içeren bir sistemdir:

  • fiziksel bellek (RAM)
  • eklediğiniz takas dosyaları
  • sanal bellek, fiziksel adreslere çevrilip fiziksel bellekte sanal adres bulunmadığında sayfa hataları yayınlamak için donanım desteği
  • (çekirdek) yazılım desteği:
    • söz konusu donanım tarafından kullanılan arama tablolarını yönetme
    • talep üzerine takas alanından sayfa çekerek bu sayfa hatalarını ele almak

İstediğiniz sanal belleğin istediğiniz zaman RAM'e önbelleğe alınmasını sağlamak çekirdeğe bağlıdır - kendi kullanıcı alanı VM katmanınızı (veritabanları genellikle yapar, iiuc gibi) yazmıyorsanız, sadece endişelenmeyin.


Tamam, sanal bellek varsayım yanlıştı. Her neyse hızlı bir takip sorusu .. SWAP Alanı RAM'den fazla ise, tam olarak yüklenen maksimum iş parçacığı performansı etkilenir mi?
dragosrsupercool

@dragosrsupercool: Takas alanınız her zaman fiziksel bellekten daha büyük olacaktır, aksi takdirde sanal bellek kullanmanız gerekebilir.
Bryan Oakley

1
@BryanOakley: Bu mutlaka doğru değil. Bazı işletim sistemleri tahsis edilen her sanal sayfa için bir takas sayfası tahsis eder (yani takas en az fiziksel kadar büyük olmalıdır). Diğer işletim sistemleri bir takas sayfasını yalnızca bir sayfayı fiziksel bellekten çıkarmaya ihtiyaç duyulduğunda tahsis eder (yani takas fizikselden daha az olabilir). Birincisinin avantajı, ayırma başarılı olursa, o zaman hafızanın değiştirilmesinin her zaman başarılı olmasıdır. İkincisinin avantajı, nispeten nadir durumları hesaba katmak için büyük takas dosyalarını karamsar olarak tahsis etmenize gerek olmamasıdır.
mcmcc

1
@dragosrsupercool, RAM miktarınız düşük ve gerçekten sayfalama yapmadığınız sürece performans RAM miktarından, takastan veya aralarındaki orandan etkilenmez . sar size iirc disk belleği etkinliği hakkında bilgi verebilir (işaretli: sar -BLinux'ta).
Yararsız

@Useless: RAM'i tamamen kullanana ve sayfalamaya başlamayana kadar iş parçacığı sayısını artırmak istiyorum.
dragosrsupercool

14

İş parçacığı gerçekten çalışıyorsa, geçerli yönerge ve iş parçacığının kullandığı değişkenler fiziksel bellekte olmalıdır.

Çoğu (aslında neredeyse tüm) programlar sanal bellekte bulunur ve çoğu program değişkenlerin depolanması için sanal bellek kullanır.

Sanal adresler sayfa adı verilen yığınlar halinde düzenlenmiştir (bunlar genellikle 4096 veya 8192 bayt bloktur).

Herhangi bir zamanda, her sanal bellek bloğu, gerçek bellekte veya bunun için ayrılmış "takas alanında" diskte bir yerde saklanır.

Program kodunuz sanal adreslerle ilgilenir, sanal bir adrese daldığınızda veya sanal bir adresten depolamaya erişim istediğinde sistem (genellikle donanım düzeyinde) adres isteğinin geçerli konumunu bulur ve sanal adresinizle eşleştirir, adres o anda diskte bulunuyorsa, gerçek belleğe sayfalar ve adresi eşler.

Açıkçası, tüm fiziksel bellek kullanımdaysa, başka bir şey çağrılmalıdır, bu nedenle sistem "Son Kullanılan En Az Kullanılanlar" sayfasını arar ve talep ettiğiniz sayfayı kopyalamadan önce bunu diske kopyalar.

Modern sistemlerde sanal depolama ile ilişkili çeşitli optimizasyonlar ve püf noktaları vardır.

  • Adresler "işlem başına" esasına göre eşlenir, böylece Linux kutusundaki tüm C programları aynı adreste "ana" işlemi başlatır.
  • Bu, 32 bit sanal adres gerçek bir 64 bit adresle eşleştirilebildiğinden, 32 bit işlemlerin bir makinede 4 GB'den daha fazlasını işgal etmesini ve kullanmasını sağlayabilir.
  • İşlemler sona erdiğinde veya bellek başka şekilde "serbest" olduğunda, sistem sayfaları yalnızca boş olarak işaretler, hiçbir zaman takas diskine kopyalanmaz.
  • Benzer şekilde yeni bir depolama bloğu istendiğinde, sistem gerçek bellekte boş bir sayfa alır, hayır, disk GÇ gerçekleşir.
  • Uyku ve hazırda bekletme işlevleri, tüm belleği takas alanına kopyalanmaya zorlar, böylece tüm geçerli işlemler ve mevcut bellek içerikleri uyandırma sırasında yeniden oluşturulabilir.

3
"Bir Linux kutusundaki tüm C programları aynı adreste başlar [main]" adres alanı düzeni rasgeleleştirmesini dikkate almıyor gibi görünmektedir. Bu, bugün çeşitli yığın parçalama saldırı düzenlerini engellemek için giderek daha fazla kullanılmaktadır. Aksi takdirde iyi cevap, yani +1.
CVn

7

Her şeyden önce, bilgisayar belleğiyle ilgili daha fazla şey okumalısınız , çünkü o alanda bilgi eksikliği var gibi görünüyor.

Yürütme iş parçacığı , bir işletim sistemi tarafından zamanlanabilen en küçük işlem birimidir. İş parçacıklarının ve işlemlerin uygulanması bir işletim sisteminden diğerine farklılık gösterir, ancak çoğu durumda bir işlem içinde bir iş parçacığı bulunur. Birden çok iş parçacığı aynı işlem içinde bulunabilir ve bellek gibi kaynakları paylaşabilirken, farklı işlemler bu kaynakları paylaşmaz.

Böylece, iş parçacıkları kullanılabilir belleği kullanacaktır - her ne tür olursa olsun. Kaç tane iş parçacığı başlatabileceğiniz, bellek boyutuna ve her iş parçacığı için ne kadar bellek gerektiğine bağlıdır. İş parçacığı yığın kullanırsa (yalnızca yığın değil), daha fazla belleğe ihtiyaç duyar ve bu durumda daha az iş parçacığı başlatabilirsiniz.


@VJonvic: Temel iş parçacığı açıklaması için +1.
dragosrsupercool

6

Sorunuzun basit cevabı, sanal bellek kullanıyorlar. işletim sistemi ile ilgili birkaç işlem dışında her şey sanal bellek kullanır.

Öte yandan, iş parçacığınız (veya herhangi bir işlemde herhangi bir iş parçacığı) gerçekten çalışıyorsa, fiziksel bellek kullanır. Bu işlemle ilişkili bellek sayfaları, işlemcinin çalıştığı fiziksel belleğe değiştirilir.


3

Sanal bellek, RAM'iniz ve takas alanınızdır. Sanal, programınızın gördüğü adresin RAM yongasının gördüğü adresten farklı olduğu anlamına gelir. Takasta belleğe erişmeniz gerekiyorsa, işletim sistemi önce RAM'e taşır. Değiştirmek istemiyorsanız, devre dışı bırakmanız yeterlidir. Yeterli RAM'iniz varsa buna gerçekten ihtiyacınız yoktur.

Bununla birlikte, 10.000 çekirdekli işlemciniz olmadığı sürece 10.000 iş parçacığına çıkmak gerçekten bir "optimizasyon" değildir. Tüm çekirdekleri tüketmek için yeterli iş parçacığına ve bu iş parçacıkları engellendiğinde bir veya iki iş yerinize sahip olduğunuzda, daha fazla iş parçacığı eklemek , geçiş yükü ve önbellek özledikleri nedeniyle performansı düşürür . Program mantığınızı basitleştirirse daha fazla iş parçacığı kullanmak isteyebilirsiniz, ancak performans dışında işlem yapacaksınız.


Evet, sunucum 32bit tek çekirdekli bir makine olduğundan 10.000 çok fazla. Aslında, iş parçacıkları toplam işlemci değildir. Bunlar tarayıcı iş parçacıklarıdır, bu nedenle bazen sunucu yanıtını beklemek gibi olurlar. İşlemcinin tamamen dolu olduğundan, aşırı veya aşırı yüklenmediğinden emin olmayı amaçlıyorum. Ama hala CPU'nun serbest veya tamamen dolu olup olmadığını nasıl bilebilirim anlayamıyorum. Herhangi bir araç veya komut var mı?
dragosrsupercool

Bence bu bilgiyi topkomuttan alabilirsiniz.
Karl Bielefeldt

@KarlBieledeldt: evet tam olarak aradığım şey buydu .. Bir sonraki takip soru: Ben sadece bir iplik diğer iplik sunucu yanıtı alırken urls için istek gönderebilir, o zaman tutabilirsiniz tarama için bir fikir geldi CPU kullanımı çok fazla iş parçacığı kullanmadan yüksek. Mümkün mü? Diğer ileti dizisine yanıt alırken bir ileti dizisinden istek göndermek gibi mi?
dragosrsupercool

2

Linux sunucumu işlem başına 10.000 iş parçacığını işleyecek şekilde optimize et

Diğerlerinin açıkladığı gibi, bu genellikle yanlıştır. Bir iş parçacığı pahalı bir kaynaktır kendi vardır, özellikle, çünkü çağrı yığınını (genellikle bir megabyte) ve çekirdek tarafından bir görev zamanlanabilen çünkü. İş parçacıkları, açılan dosya tanımlayıcılarından daha da maliyetlidir .

İşletim Sistemlerini Okuyun : Üç Kolay Parça (serbestçe indirilebilir ders kitabı).

Genel bir kural olarak, çok fazla iş parçacığı ve kesinlikle çalıştırılabilir iş parçacığı istemezsiniz. Çalıştırılabilir ipliklerin sayısı genellikle en fazla çekirdek (veya bunun küçük bir katı) olmalıdır, bu yüzden en fazla yaklaşık bir düzine olmalıdır. Bir işlemdeki iş parçacığı sayısı biraz daha fazla olabilir. Dolayısıyla, çok geniş bir sunucunuz yoksa (birçok işlemci soketi ve çekirdeği ile), bir düzineden fazla çalıştırılabilir iş parçacığı ve işleminizde (çoğu boşta olan) yüz iş parçacığının (çoğu boşta) olmasını istemezsiniz .

Linux'ta, iş parçacıkları ve işlemler çok benzerdir (çünkü her ikisi de klon (2) tarafından oluşturulabilir ) ve her ikisi de çekirdek tarafından zamanlanan görevlerdir. Aslında çekirdek zamanlayıcı, bazı çok iş parçacıklı işlemin içinde iş parçacıkları veya tek iş parçacıklı bir işlemin tek ana iş parçacığı (bu durumda, bu tek iş parçacığını "işleyeceksiniz") veya çekirdek iş parçacıkları olabilecek zamanlama görevleridir. Muhtemelen masaüstü sisteminizde toplamda binden fazla zamanlanabilir göreve sahip olmak istemezsiniz.

Linux'ta bir işlem , aynı sanal adres alanını paylaşan (ve dosya tanımlayıcı tablosu vb. Gibi başka şeyleri paylaşan) bir iş parçacığı grubudur . Bazı işlemlerin yalnızca bir iş parçacığı vardır.

Bir sanal adres alanı olduğu belirlenen şekilde Wikipedia tarafından

"Bir işletim sisteminin bir işlem için kullanılabilir kıldığı sanal adres aralıkları kümesi"

(ancak terminolojinin evrensel olmadığını ve bu Microsoft belgelerinin farklı ve uyumsuz bir tanım kullandığını açıklayan bu cevaba bakınız ).

Linux'ta, proc (5) bazı işlemlerin sanal adres alanını anlamak için kullanışlıdır. Her ikisini de
cat /proc/self/mapsve cat /proc/$$/mapsbir terminalde deneyin . Ayrıca bkz , bu ve pmap (1) ve PS (1) ve üst (1) .

Tüm kullanıcı-alanı programları bir işlemde çalışıyor ve sanal bellek kullanıyor, böylece her işlemin kendi sanal adres alanı var. Fiziksel RAM , Linux çekirdeği tarafından yönetilen bir kaynaktır ve uygulamaların RAM'e doğrudan erişimi yoktur ( mmap (2) -ing dışında /dev/mem, bkz. Mem (4) ).

Yani bir işlem doğrudan RAM kullanmaz . Sanal bellek kullanır ve kendi sanal adres alanına sahiptir. Çekirdek kullanır çağrı fiziksel RAM yönetmek için sayfaları ve sanal adres alanı ve süreci sağlamak soyutlamalar . Herhangi bir zamanda (işleminiz boştayken veya çalışırken) çekirdek bazı sayfaları dışarı çıkarabilir (örn. Bunları diskte değiştirebilirsiniz). Çekirdek MMU'yu yapılandırıyor (ve sayfa kesinti işleyicilerinde , sayfa diskten getirilerek veya işleme bir segmentasyon hatası yayılarak bazı donanım işleyicilerindeki donanım istisnalarını işliyor , bkz. Sinyal (7) )

Sen olabilir yeşil konuları sistem ipler (ama yeşil iplik kütüphaneleri uygulamak ve hata ayıklama zor) üzerindedir. İçine bak goroutines kullanılan Go süslü örneğin. Ayrıca setcontext'e (3) bakınız .

Bazen, sisteminiz atmayı deneyebilir . Bu, toplam sanal bellek (tüm işlemlerin gerektirdiği) mevcut fiziksel RAM'i -büyük bir faktör- aştığında olur. Sonra bilgisayarınız yanıt vermiyor. Yerleşik küme boyutu , talep çağrısı , çalışma kümesi , aşırı bellek taahhüdü , ASLR hakkında bilgi edinin .

Linux- -için Ayrıca bkz çatal (2) , klon (2) , mmap'in (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , kimlik bilgileri (7) , Pthreads (7) , futex (7) , yetenekler (7) .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.