optimalkan server Linux saya untuk menangani 10.000 utas per proses
Seperti yang dijelaskan orang lain, ini umumnya salah. Sebuah benang adalah sumber daya mahal , terutama karena memiliki sendiri panggilan stack (biasanya, megabyte) dan karena itu adalah tugas schedulable oleh kernel. Utas bahkan lebih mahal daripada deskriptor file yang dibuka .
Baca Sistem Operasi: Tiga Potong Mudah (buku teks yang dapat diunduh secara bebas)
Sebagai aturan praktis, Anda tidak ingin memiliki banyak utas, dan tentu saja tidak banyak utas yang dapat dijalankan. Jumlah utas runnable umumnya harus paling banyak jumlah inti (atau kelipatan kecil dari itu), jadi sekitar selusin paling banyak. Jumlah utas dalam suatu proses bisa sedikit lebih besar. Jadi kecuali Anda memiliki server yang sangat luas (dengan banyak soket dan inti prosesor), Anda tidak ingin memiliki lebih dari selusin utas yang dapat dijalankan, dan seratus utas (kebanyakan dari mereka tidak digunakan) dalam proses Anda (pada desktop Anda) .
Di Linux, utas dan proses sangat mirip (karena keduanya dapat dibuat oleh klon (2) ) dan keduanya adalah tugas yang dijadwalkan oleh kernel. Sebenarnya penjadwal kernel adalah tugas penjadwalan yang dapat berupa utas di dalam beberapa proses multi-utas, atau utas utama tunggal dari proses utas tunggal (dalam hal ini, Anda akan menamai "proses" dengan utas tunggal), atau utas kernel. Anda mungkin tidak ingin memiliki lebih dari seribu tugas yang dapat dijadwalkan secara total pada sistem desktop Anda.
Di Linux, suatu proses hanyalah sekelompok utas yang berbagi ruang alamat virtual yang sama (dan berbagi beberapa hal lain, seperti tabel deskriptor file, dll ...). Beberapa proses hanya memiliki satu utas.
Sebuah ruang alamat virtual yang didefinisikan oleh Wikipedia sebagai
"set kisaran alamat virtual yang disediakan sistem operasi untuk suatu proses"
(tetapi lihat juga jawaban ini yang menjelaskan bahwa terminologinya tidak universal, dan beberapa dokumentasi Microsoft menggunakan definisi yang berbeda dan tidak sesuai ).
Di Linux, proc (5) berguna untuk memahami ruang alamat virtual dari beberapa proses. Coba keduanya
cat /proc/self/maps
dan cat /proc/$$/maps
di terminal. Lihat juga ini , dan pmap (1) & ps (1) & top (1) .
Semua program ruang pengguna berjalan dalam beberapa proses dan menggunakan memori virtual sehingga setiap proses memiliki ruang alamat virtual sendiri. RAM fisik adalah sumber daya yang dikelola oleh kernel Linux, dan aplikasi tidak memiliki akses langsung ke RAM (kecuali oleh mmap (2) -ing /dev/mem
, lihat mem (4) ).
Jadi suatu proses tidak menggunakan RAM secara langsung . Ini menggunakan memori virtual dan memiliki ruang alamat virtual sendiri. The kernel menggunakan paging untuk mengelola RAM fisik halaman dan memberikan ruang alamat virtual dan proses abstraksi . Kapan saja (bahkan ketika proses Anda idle, atau ketika sedang berjalan) kernel bisa mengeluarkan beberapa halaman (misalnya menukar mereka pada disk). Kernel mengkonfigurasi MMU (dan menangani pengecualian perangkat keras kehilangan halaman dalam beberapa interrupt handler , baik dengan mengambil halaman dari disk atau dengan menyebarkan kesalahan segmentasi ke proses, lihat sinyal (7) )
Anda dapat memiliki utas hijau di atas utas sistem (tapi pustaka utas hijau sulit diterapkan dan didebug). Lihatlah goroutine yang digunakan di Go untuk contoh yang bagus. Lihat juga setcontext (3) .
Terkadang, sistem Anda dapat bereksperimen meronta-ronta . Ini terjadi ketika total memori virtual (dibutuhkan oleh semua proses) melebihi -dengan faktor besar- RAM fisik yang tersedia. Kemudian komputer Anda menjadi tidak responsif. Baca tentang ukuran set penduduk , paging permintaan , set kerja , overcommitmment memori , ASLR .
Lihat juga -untuk Linux- fork (2) , clone (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , kredensial (7) , pthreads (7) , futex (7) , kemampuan (7) .