php - 计算密集型和IO密集型
巴扎黑
巴扎黑 2017-05-16 13:12:46
0
4
930

请问为什么到底什么样的业务是计算密集型,什么样的业务是IO密集型?为什么说PHP最初设计是针对计算机密集型的,node.js是针对IO密集型的?

巴扎黑
巴扎黑

membalas semua(4)
漂亮男人

Saya membaca satu bab dalam blog Liao Xuefeng semalam tentang: Intensif Pengkomputeran lwn Intensif IO, petikan adalah seperti berikut:

Kita boleh membahagikan tugas kepada intensif pengkomputeran dan intensif IO.

Tugas

Intensif pengkomputerandicirikan dengan memerlukan sejumlah besar pengiraan dan menggunakan sumber CPU, seperti pengiraan pi, penyahkodan definisi tinggi video, dsb., semuanya bergantung pada kuasa pengkomputeran CPU. Walaupun tugasan intensif pengkomputeran ini juga boleh diselesaikan dengan pelbagai tugas, semakin banyak tugasan, semakin banyak masa yang dihabiskan untuk menukar tugas, dan semakin rendah kecekapan CPU dalam melaksanakan tugasan penggunaan CPU, tugas intensif pengkomputeran Bilangan tugas serentak hendaklah sama dengan bilangan teras CPU.

Tugas intensif pengkomputeran terutamanya menggunakan sumber CPU, jadi kecekapan menjalankan kod adalah penting. Bahasa skrip seperti Python berjalan dengan sangat tidak cekap dan sama sekali tidak sesuai untuk tugasan intensif pengiraan. Untuk tugasan intensif pengiraan, lebih baik menulis dalam bahasa C.

IO-intensif, tugas yang melibatkan rangkaian dan cakera IO adalah semua tugasan intensif IO Ciri-ciri tugasan jenis ini ialah penggunaan CPU sangat kecil, dan kebanyakan tugas sedang menunggu operasi IO selesai. (kerana kelajuan IO jauh lebih rendah daripada kelajuan CPU dan memori). Untuk tugas intensif IO, lebih banyak tugas, lebih tinggi kecekapan CPU, tetapi ada hadnya. Tugas yang paling biasa adalah tugas intensif IO, seperti aplikasi web.

Semasa pelaksanaan tugas intensif IO, 99% masa dihabiskan untuk IO, dan sangat sedikit masa dibelanjakan untuk CPU Oleh itu, menggantikan bahasa skrip yang sangat perlahan seperti Python dengan bahasa C yang sangat pantas adalah kecekapan Operasi sepenuhnya tidak boleh diperbaiki. Untuk tugasan intensif IO, bahasa yang paling sesuai ialah bahasa dengan kecekapan pembangunan tertinggi (jumlah kod yang paling sedikit ialah bahasa skrip adalah pilihan pertama, dan bahasa C adalah yang paling teruk).

小葫芦

Terdapat chestnut yang digunakan dengan baik yang menerangkan konsep tidak menyekat dan event-driven bahasa Node.js, yang kira-kira seperti ini: 非阻塞事件驱动 概念,大约是这样的:

你到餐馆吃饭,餐馆里的服务员在帮你点单之后,会直接把菜单塞给厨房,然后立刻去到下一位顾客处,而非在厨房等待(阻塞)。直到烹饪结束后,厨师大喊“来拿菜”(事件)。服务员跑回厨房,把菜品端到你的桌子上(事件处理/回调

在这个栗子中,我们可以简单的理解为:服务员相当于 CPU,而厨房的工作就是I/O。显然的,在一个饭店里,服务员的工作并不复杂,”等待上菜的时间“多数是花在”等待厨房“上。这与如今大多数网站的情况相似:网站通常不需要做太多复杂的运算,但需要花费大量的时间等待 I/O 处理,比如数据库查询,比如图片、视频的读取。

于是 Node.js 舍弃了传统 Web 服务中“每当一次请求来临,都打开一个线程来单独处理”的做法,而是采用事件驱动的模型,默认情况下,仅用单线程就可以负担相当高的并发量。

于是在这种情境下,我们说:Node.js 更适合 IO密集型的任务处理

但如果我们把上面的栗子更换一下,比如说咱们不开饭馆,开银行。每当客户到来,要求取出指定的款项,作为服务员,你需要根据客户的账户等级计算利率,计算利息,计算分红,等等……(随意想到的比方,可能不太恰当),而“取钱并交给客户”这个动作本身却并不复杂。

这时候,就不能指望像饭店那样,只靠一个服务员就能应付大量的客户,因为每个请求都需要独占服务员大量的时间(不可避免的阻塞

Apabila anda pergi ke restoran untuk makan, pelayan di restoran akan memberikan menu terus ke dapur selepas mengambil pesanan anda, dan kemudian segera pergi ke pelanggan seterusnya dan bukannya menunggu di dapur (Menyekat kod>). Sehingga memasak selesai, chef menjerit "datang dan dapatkan makanan" (acara). Pelayan berlari semula ke dapur dan membawa hidangan ke meja anda (Pengendalian acara/Panggil balik)

Dalam chestnut ini, kita boleh faham bahawa pelayan adalah bersamaan dengan CPU, dan tugas dapur ialah I/O. Jelas sekali, di restoran, tugas pelayan tidak rumit. Ini serupa dengan situasi kebanyakan tapak web hari ini: tapak web biasanya tidak perlu melakukan terlalu banyak operasi yang kompleks, tetapi mereka perlu menghabiskan banyak masa menunggu pemprosesan I/O, seperti pertanyaan pangkalan data, seperti membaca gambar dan video . 🎜 🎜Jadi Node.js telah meninggalkan amalan "setiap kali permintaan datang, buka utas untuk pemprosesan berasingan" dalam perkhidmatan web tradisional dan sebaliknya menggunakan model dipacu peristiwa Secara lalai, hanya satu utas boleh menanggung beban yang tinggi keselarasan. 🎜 🎜Jadi dalam situasi ini, kami katakan: Node.js lebih sesuai untuk pemprosesan tugas intensif IO. 🎜 🎜Tetapi jika kita menukar berangan di atas, sebagai contoh, kita tidak membuka restoran, tetapi bank. Setiap kali pelanggan datang dan meminta untuk mengeluarkan jumlah wang tertentu, sebagai pelayan, anda perlu mengira kadar faedah, mengira faedah, mengira dividen, dan lain-lain mengikut tahap akaun pelanggan... (metafora rawak mungkin tidak sesuai), dan "Keluarkan wang" Dan serahkan kepada pelanggan" Tindakan ini sendiri tidak rumit. 🎜 🎜Pada masa ini, kami tidak boleh menjangkakan bahawa hanya seorang pelayan boleh mengendalikan sejumlah besar pelanggan seperti restoran, kerana setiap permintaan memerlukan sejumlah besar masa pelayan (tidak dapat dielakkan menyekat). Pada masa ini, model tradisional seperti PHP mungkin menjadi lebih sesuai. 🎜 🎜Perkara di atas, saya harap ia dapat menjernihkan kekeliruan anda🎜
为情所困
  • IO-intensif: Aplikasi dengan banyak IO, seperti penghantaran rangkaian, panggilan pangkalan data, dsb. Kebanyakan aplikasi web adalah seperti ini

  • Intensif pengiraan: Seperti namanya, ia adalah jenis aplikasi yang memerlukan banyak pengiraan CPU. Aplikasi seperti pengkomputeran awan harus termasuk dalam kategori ini.

曾经蜡笔没有小新

Apakah yang intensif secara pengiraan? Contohnya, letakkan pangkalan data SQLite pada sistem fail memori Linux /dev/shm untuk melakukan pertanyaan SELECT pada 1 juta data Kemudian pertanyaan SELECT ini, apabila menggunakan indeks pepohon B+, menjalankan pertanyaan SELECT indeks pokok B+ Carian binari pada adalah pengiraan intensif biasa Jika tiada indeks digunakan, hanya mengimbas keseluruhan jadual juga merupakan pengiraan intensif penggunaan .

Apakah IO intensif Sebagai contoh, pangkalan data SQLite tiada dalam ingatan, tetapi pada cakera mekanikal biasa, operasi tulis (MASUKKAN/KEMASKINI/DELETE) adalah operasi intensif IO biasa, kerana tidak kira berapa laju CPU pada masa ini , enjin SQLite lebih pantas , juga akan diperlahankan oleh operasi tulis cakera mekanikal Oleh itu, demi keselarasan, SQLite kemudiannya memperkenalkan WAL (log tulis ke hadapan) tulis ke hadapan. sokongan log. Konfigurasi khusus adalah untuk melaksanakan pertanyaan SQLite: WAL(write-ahead log)预写式日志支持,具体配置就是执行一下SQLite查询:

PRAGMA synchronous = NORMAL;
PRAGMA journal_mode = WAL;

WAL机制的原理是: 修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中(data.db3-wal). 如果事务失败,WAL中的记录会被忽略,撤销修改. 如果事务成功,它将在随后的某个时间(PRAGMA synchronous = NORMAL)被写回到数据库文件中,提交修改. 同步WAL文件和数据库文件的行为被称为checkpoint(检查点),它由SQLite自动执行, 默认是在WAL文件积累到1000页修改的时候(PRAGMA wal_autocheckpoint). 在适当的时候,也可以手动执行checkpoint,SQLite提供了相关的接口,执行 PRAGMA wal_checkpoint 之后,WAL文件会被清空. 在读的时候,SQLite将在WAL文件中搜索,找到最后一个写入点,记住它,并忽略在此之后的写入点(这保证了读写和读读可以并行执行). 随后,它确定所要读的数据所在页是否在WAL文件中,如果在,则读WAL文件中的数据,如果不在,则直接读数据库文件中的数据. 在写的时候,SQLite将之写入到WAL文件中即可,但是必须保证独占写入,因此写与写之间不能并行执行. WAL在实现的过程中,使用了共享内存技术(data.db3-shm),因此,所有的读写进程必须在同一个机器上,否则,无法保证数据一致性.

像WAL和checkpoint这种概念,在其他数据库比如MySQL中也存在,只不过MySQL会更复杂,能支持更大规模的并发写操作.像WAL+checkpoint rrreee

Prinsip mekanisme WAL ialah: pengubahsuaian tidak ditulis terus ke fail pangkalan data, tetapi ke fail lain yang dipanggil WAL (data.db3-wal Jika transaksi gagal, rekod dalam WAL akan diabaikan , Buat asal pengubahsuaian). Jika urus niaga berjaya, ia akan ditulis kembali ke fail pangkalan data pada masa yang akan datang (PRAGMA segerak = NORMAL) dan melakukan pengubahsuaian Kelakuan menyegerakkan fail WAL dan fail pangkalan data dipanggil checkpoint secara automatik SQLite. Lalai adalah apabila fail WAL mengumpulkan 1000 halaman pengubahsuaian (PRAGMA wal_autocheckpoint Pada masa yang sesuai, anda juga boleh melaksanakan secara manual SQLite antara muka yang berkaitan Selepas melaksanakan PRAGMA wal_checkpoint membaca, SQLite akan mencari dalam fail WAL untuk mencari titik penulisan terakhir, mengingatinya, dan mengabaikan titik penulisan selepas ini (ini memastikan bahawa membaca dan menulis boleh dilakukan secara selari, Ia menentukan sama ada halaman data itu). dibaca adalah dalam fail WAL Jika ada, baca data dalam fail WAL. Jika tidak, baca data dalam fail pangkalan data secara langsung mesti dijamin, jadi penulisan dan penulisan tidak boleh dilaksanakan secara selari Semasa pelaksanaan WAL, teknologi memori kongsi (data.db3-shm) digunakan, jadi semua proses membaca dan menulis mesti berada dalam Pada mesin yang sama, jika tidak, data. konsisten tidak boleh dijamin.

Konsep seperti WAL dan pusat pemeriksaan juga wujud dalam pangkalan data lain seperti MySQL, tetapi MySQL lebih kompleks dan boleh menyokong operasi tulis serentak berskala lebih besar seperti cara WAL+checkpoint, anda boleh menganggapnya sebagai tulisan tak segerak.🎜 🎜Penerjemah JS Node adalah berdasarkan V8 Chromium, dan V8 mempunyai mekanisme kompilasi tepat masa JIT, jadi prestasi pengkomputeran intensif Node adalah lebih teruk daripada PHP Walaupun pegawai PHP kini sedang membangunkan ujian JIT PHP, prestasinya Masih tidak sebaik V8. Walau bagaimanapun, walaupun Node mempunyai prestasi pengkomputeran yang baik, hampir tiada siapa yang akan mengesyorkan melakukan pengiraan intensif berskala besar dalam Node, kerana pengiraan intensif pasti akan menyekat perkhidmatan Node, yang bertentangan dengan konsep tidak menyekat yang dianjurkan oleh Node.🎜

Node menggunakan ciri didorong peristiwa JS untuk mencapai tanpa sekatan, tetapi kaedah pengaturcaraan acara berasaskan panggilan balik tidak kondusif untuk penyelenggaraan kod Selain itu, perkhidmatan seperti Node tidak boleh menggunakan proses tunggal, berbilang benang dan berbilang teras seperti Java perkhidmatan seperti Tomcat, dan V8 tidak Ia tidak direka untuk multi-threading, jadi pegawai Node hanya boleh membina modul berbilang proses kelompok untuk memanfaatkan berbilang teras.

PHP agak biasa-biasa sahaja, dan kelajuan pengiraannya tidak sepantas bahasa JIT Walau bagaimanapun, dalam kalangan bahasa skrip umum bukan JIT, PHP tidak perlahan, contohnya, PHP5 lebih pantas daripada Python, dan PHP7 jauh lebih pantas daripada Python, seperti php-src Dalam ujian /Zend/bench.php, penggunaan masa PHP 7.1 hanya 1/4 daripada 5.4.

Selain itu, kaedah menjalankan FastCGI berbilang proses seperti PHP-FPM dan Apache MOD_PHP dengan mudah boleh menggunakan berbilang teras Selain itu, opcache juga boleh didayakan untuk cache opcode skrip PHP dengan kata lain, dengan andaian anda menentukan banyak fungsi dalam In functions.php, selepas opcache menyimpan skrip dalam ingatan, tidak perlu menghuraikan semula skrip setiap kali PHP diminta, dan opcode boleh dilaksanakan secara langsung Peningkatan prestasi sangat jelas, terutamanya untuk kompleks Aplikasi PHP.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!