ในทางเทคนิคเหตุใดกระบวนการใน Erlang จึงมีประสิทธิภาพมากกว่าเธรด OS


170

ลักษณะของ Erlang

จากการเขียนโปรแกรม Erlang (2009):

การทำงานพร้อมกันของ Erlang นั้นรวดเร็วและสามารถปรับขนาดได้ กระบวนการมีน้ำหนักเบาซึ่งเครื่องเสมือน Erlang ไม่ได้สร้างเธรด OS สำหรับทุกกระบวนการที่สร้างขึ้น พวกเขาถูกสร้างกำหนดเวลาและจัดการใน VM เป็นอิสระจากระบบปฏิบัติการพื้นฐาน เป็นผลให้เวลาการสร้างกระบวนการเป็นลำดับไมโครวินาทีและเป็นอิสระจากจำนวนกระบวนการที่มีอยู่พร้อมกัน เปรียบเทียบสิ่งนี้กับ Java และ C # ซึ่งทุกขั้นตอนจะสร้างเธรด OS พื้นฐานขึ้นมา: คุณจะได้รับการเปรียบเทียบที่แข่งขันได้มากโดย Erlang มีประสิทธิภาพเหนือกว่าทั้งสองภาษา

จากการเขียนโปรแกรมเชิง Concurrency ใน Erlang (pdf) (สไลด์) (2003):

เราสังเกตว่าเวลาที่ใช้ในการสร้างกระบวนการ Erlang นั้นมีค่าคงที่ 1 ถึง 2,500 กระบวนการ; หลังจากนั้นจะเพิ่มขึ้นเป็นประมาณ 3 วินาทีสำหรับกระบวนการมากถึง 30,000 กระบวนการ ประสิทธิภาพของ Java และ C # จะแสดงที่ด้านบนของภาพ สำหรับกระบวนการจำนวนน้อยจะใช้เวลาประมาณ 300 วินาทีในการสร้างกระบวนการ การสร้างกระบวนการมากกว่าสองพันรายการเป็นไปไม่ได้

เราเห็นว่าสำหรับกระบวนการมากถึง 30,000 กระบวนการเวลาในการส่งข้อความระหว่างสองกระบวนการของ Erlang นั้นประมาณ 0.8µs สำหรับ C # ใช้เวลาประมาณ 50 ต่อข้อความขึ้นกับจำนวนสูงสุดของกระบวนการ (ซึ่งประมาณ 1800 กระบวนการ) Java ยิ่งแย่ลงสำหรับกระบวนการมากถึง 100 กระบวนการนั้นใช้เวลาประมาณ 50 ต่อข้อความหลังจากนั้นจะเพิ่มขึ้นอย่างรวดเร็วเป็น 10ms ต่อข้อความเมื่อมีกระบวนการ Java ประมาณ 1,000 กระบวนการ

ความคิดของฉัน

ฉันไม่เข้าใจอย่างถ่องแท้ในทางเทคนิคว่าเหตุใดกระบวนการ Erlang จึงมีประสิทธิภาพมากกว่าในการวางไข่กระบวนการใหม่และมี footprints หน่วยความจำที่เล็กลงต่อกระบวนการ ทั้งระบบปฏิบัติการและ Erlang VM ต้องทำการตั้งเวลาสลับบริบทและติดตามค่าในรีจิสเตอร์และอื่น ๆ ...

ทำไมเธรด OS จึงไม่นำไปใช้ในวิธีเดียวกันกับกระบวนการใน Erlang พวกเขาต้องสนับสนุนอะไรมากกว่านี้ไหม? และทำไมพวกเขาต้องการรอยความทรงจำที่ใหญ่กว่า? และทำไมพวกเขาถึงมีการวางไข่และสื่อสารช้าลง?

ในทางเทคนิคเหตุใดกระบวนการใน Erlang จึงมีประสิทธิภาพมากกว่าเธรด OS เมื่อพูดถึงการวางไข่และการสื่อสาร และทำไมไม่สามารถใช้งานและจัดการเธรดในระบบปฏิบัติการได้อย่างมีประสิทธิภาพเหมือนกัน? และทำไมเธรด OS จึงมีหน่วยความจำขนาดใหญ่กว่ารวมถึงการวางไข่และการสื่อสารที่ช้าลง

อ่านเพิ่มเติม


1
ก่อนที่จะพยายามเข้าใจเหตุผลว่าทำไมสมมติฐานจึงเป็นจริงคุณต้องระบุว่าสมมติฐานนั้นเป็นจริงหรือไม่ตัวอย่างเช่นได้รับการสนับสนุนจากหลักฐาน คุณมีการอ้างอิงสำหรับการเปรียบเทียบที่เหมือนกันหรือไม่แสดงให้เห็นว่ากระบวนการของ Erlang นั้นมีประสิทธิภาพมากกว่าการใช้เธรด Java บน JVM ที่ทันสมัยหรือไม่? หรือแอพ C ที่ใช้กระบวนการ OS และรองรับเธรดโดยตรง (หลังดูเหมือนว่าไม่น่าเป็นไปได้สำหรับฉันคนแรกค่อนข้างจะเป็นไปได้เท่านั้น) ฉันหมายถึงด้วยสภาพแวดล้อมที่ จำกัด (จุดของฟรานซิสโก) มันอาจเป็นจริง แต่ฉันต้องการเห็นตัวเลข
TJ Crowder

1
@ Donal: เช่นเดียวกับกรณีที่มีข้อความเด็ดขาดอื่น ๆ มากมาย :-)
TJ Crowder

1
@ Jonas: ขอบคุณ แต่ฉันได้เท่าที่วันที่ (1998-11-02) และรุ่น JVM (1.1.6) และหยุด JVM ของ Sun ได้ปรับปรุงบิตที่เป็นธรรมในช่วง11.5 ปีที่ผ่านมา (และล่ามของ Erlang ก็น่าจะมีเช่นกัน) โดยเฉพาะในพื้นที่ที่มีเกลียว (เพื่อความชัดเจนฉันไม่ได้บอกว่าสมมติฐานนั้นไม่เป็นความจริง [และ Francisco และ Donal ได้ชี้ให้เห็นว่าทำไม Erland ถึงสามารถทำอะไรบางอย่างที่นั่น] ฉันกำลังบอกว่ามันไม่ควรถูกมองข้าม โดยไม่ได้ตรวจสอบ)
TJ Crowder

1
@ Jonas: "... แต่ฉันเดาว่าคุณสามารถทำได้ใน Erlang ... "มันคือ "เดา" ส่วนเพื่อน :-) คุณคาดเดาว่าการสลับกระบวนการของ Erlang มีมากกว่าพันคน คุณคาดเดาว่าจะทำได้ดีกว่า Java หรือเธรด OS การคาดเดาและการพัฒนาซอฟต์แวร์ไม่ใช่การผสมผสานที่ยอดเยี่ยม :-) แต่ฉันคิดว่าฉันทำไปแล้ว
TJ Crowder

17
@TJ Crowder: ติดตั้ง erlang และ run erl +P 1000100 +hms 100และดีกว่าพิมพ์{_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).แล้วรอผลประมาณ 3 นาที มันง่ายมาก ใช้ 140usas ต่อกระบวนการและ RAM 1GB ทั้งหมดบนแล็ปท็อปของฉัน แต่มันเป็นรูปแบบเชลล์โดยตรงมันควรจะดีกว่าจากการคอมไพล์โค้ด
Hynek -Pichi- Vychodil

คำตอบ:


113

มีปัจจัยสนับสนุนหลายประการ:

  1. กระบวนการ Erlang ไม่ใช่กระบวนการของระบบปฏิบัติการ มีการใช้งานโดย Erlang VM โดยใช้โมเดลการทำเธรดสหกรณ์แบบมีน้ำหนักเบา (ยึดเอาเสียก่อนที่ระดับ Erlang แต่อยู่ภายใต้การควบคุมของรันไทม์ที่จัดกำหนดการแบบร่วมมือกัน) ซึ่งหมายความว่ามันถูกกว่ามากในการสลับบริบทเนื่องจากพวกเขาสลับเฉพาะจุดที่รู้จักและควบคุมดังนั้นจึงไม่จำเป็นต้องบันทึกสถานะ CPU ทั้งหมด (ลงทะเบียน SSE และ FPU ปกติ, การจับคู่พื้นที่ที่อยู่ ฯลฯ )
  2. กระบวนการ Erlang ใช้สแต็กที่จัดสรรแบบไดนามิกซึ่งเริ่มต้นเล็กมากและเติบโตตามความจำเป็น สิ่งนี้อนุญาตให้มีการวางไข่ของกระบวนการ Erlang หลายพัน - แม้แต่ล้าน - กระบวนการโดยไม่ดูด RAM ที่มีอยู่ทั้งหมด
  3. Erlang เคยเป็นเธรดเดี่ยวซึ่งหมายความว่าไม่มีข้อกำหนดเพื่อให้มั่นใจถึงความปลอดภัยของเธรดระหว่างกระบวนการ ตอนนี้รองรับ SMP แต่การทำงานร่วมกันระหว่างกระบวนการ Erlang ในตัวกำหนดตารางเวลา / แกนเดียวกันยังคงมีน้ำหนักเบามาก (มีคิวการรันแยกกันต่อคอร์)

6
ไปยังจุดที่ 2 ของคุณ: และหากกระบวนการยังไม่ได้ทำงานไม่มีเหตุผลที่จะมีการจัดสรรสแต็กสำหรับมัน นอกจากนี้: เทคนิคต่าง ๆ สามารถเล่นได้โดยเล่นซอกับ GC ของกระบวนการเช่นที่มันไม่เคยรวบรวมหน่วยความจำ แต่นั่นเป็นขั้นสูงและค่อนข้างอันตราย :)
ฉันให้คำตอบ CRAP

3
จนถึงจุดที่ 3 ของคุณ: Erlang บังคับใช้ข้อมูลที่ไม่เปลี่ยนรูปดังนั้นการแนะนำ SMP ไม่ควรส่งผลกระทบต่อความปลอดภัยของเธรด
nilskp

@ nilskp ถูกต้อง erlang ยังเป็นภาษาการเขียนโปรแกรมที่ใช้งานได้ดังนั้นจึงไม่มีข้อมูล "ตัวแปร" ซึ่งนำไปสู่ความปลอดภัยของเธรด
liuyang1

6
@ nilskp: (RE: คุณแสดงความคิดเห็นในจุดที่ 3 ... ) แม้ว่าภาษานั้นจะมีระบบการพิมพ์ที่ไม่เปลี่ยนรูปแบบ แต่การใช้งานพื้นฐาน - การส่งข้อความการกำหนดตารางเวลา ฯลฯ - เป็นเรื่องที่แตกต่างกันโดยสิ้นเชิง การสนับสนุน SMP ที่ถูกต้องและมีประสิทธิภาพไม่ได้เกิดขึ้นเพียงแค่สะบัดของสวิตช์
Marcelo Cantos

@rvirding: ขอบคุณสำหรับภาคผนวกชี้แจง ฉันใช้เสรีภาพในการรวมคะแนนของคุณเข้ากับเนื้อหาของคำตอบของฉัน
Marcelo Cantos

73

หลังจากการวิจัยเพิ่มเติมฉันพบการนำเสนอโดย Joe Armstrong

จากErlang - ซอฟต์แวร์สำหรับโลกที่เกิดขึ้นพร้อมกัน (การนำเสนอ) (เวลา 13 นาที):

[Erlang] เป็นภาษาที่เกิดขึ้นพร้อมกันโดยที่ฉันหมายความว่าเธรดเป็นส่วนหนึ่งของภาษาการเขียนโปรแกรมซึ่งไม่ได้เป็นของระบบปฏิบัติการ นั่นเป็นสิ่งที่ผิดปกติกับภาษาการเขียนโปรแกรมเช่น Java และ C ++ มันเป็นเธรดที่ไม่ได้อยู่ในภาษาการเขียนโปรแกรมเธรดเป็นสิ่งที่อยู่ในระบบปฏิบัติการและพวกเขาสืบทอดปัญหาทั้งหมดที่มีในระบบปฏิบัติการ หนึ่งในปัญหาคือความละเอียดของระบบการจัดการหน่วยความจำ การจัดการหน่วยความจำในระบบปฏิบัติการป้องกันหน่วยความจำทั้งหน้าดังนั้นขนาดที่เล็กที่สุดที่เธรดสามารถเป็นขนาดที่เล็กที่สุดของหน้า มันใหญ่เกินไปจริงๆ

หากคุณเพิ่มหน่วยความจำเพิ่มเติมในเครื่องของคุณ - คุณมีจำนวนบิตเท่ากันที่ป้องกันหน่วยความจำดังนั้นความละเอียดของตารางหน้าจึงสูงขึ้น - คุณใช้ 64kB สำหรับกระบวนการที่คุณรู้ว่าทำงานในไม่กี่ร้อยไบต์

ฉันคิดว่ามันเป็นคำตอบถ้าไม่ใช่ทั้งหมดคำถามของฉันอย่างน้อย


2
ที่เกี่ยวข้อง: stackoverflow.com/questions/2267545/…
Jonas

2
การป้องกันหน่วยความจำบนสแต็คมีเหตุผล Erlang ไม่ปกป้องสแต็คของบริบทการดำเนินการที่แตกต่างกันผ่าน MMU ของโปรเซสเซอร์หรือไม่ (และหวังว่าจะเป็นสิ่งที่ดีที่สุด?) จะเกิดอะไรขึ้นถ้าเธรดใช้มากกว่ากองเล็ก ๆ ของมัน? (มีการตรวจสอบการจัดสรรสแต็กทั้งหมดเพื่อดูว่าจำเป็นต้องใช้สแต็กขนาดใหญ่หรือไม่สแต็กสามารถเคลื่อนย้ายได้หรือไม่)
Thanatos

2
@Thanatos: Erlang ไม่อนุญาตให้โปรแกรมเข้าถึงหน่วยความจำหรือซอกับกองซ้อน การจัดสรรทั้งหมดต้องผ่านรันไทม์ที่ได้รับการจัดการทั้งฮีปและสแต็ก กล่าวอีกนัยหนึ่ง: การปกป้องฮาร์ดแวร์นั้นไร้ประโยชน์เพราะมันป้องกันสิ่งที่ไม่สามารถเกิดขึ้นได้ ภาษาคือตัวชี้ที่ปลอดภัยกองซ้อนปลอดภัยหน่วยความจำและชนิดปลอดภัย กระบวนการไม่สามารถใช้มากกว่า "กองเล็ก ๆ " ได้เนื่องจากกองเติบโตตามต้องการ คุณอาจคิดว่ามันเป็นสิ่งที่ตรงกันข้ามกับของจิ๋ว: ไม่มีที่สิ้นสุด ( แต่การจัดสรรซม.)
Jörg W Mittag

4
คุณควรดูระบบปฏิบัติการเอกฐานโดย Microsoft Research ในภาวะเอกฐานรหัสเคอร์เนลไดรเวอร์อุปกรณ์ห้องสมุดและโปรแกรมผู้ใช้ทั้งหมดทำงานในแหวน 0 ด้วยสิทธิ์เคอร์เนลเต็ม รหัสเคอร์เนลไดรเวอร์อุปกรณ์ไลบรารีและโปรแกรมผู้ใช้ทั้งหมดทำงานในพื้นที่ที่อยู่ฟิสิคัลเดียวโดยไม่มีการป้องกันหน่วยความจำ แต่อย่างใด ทีมพบว่าการรับประกันว่าภาษานั้นแข็งแกร่งกว่าการรับประกัน MMU ที่สามารถทำได้และในขณะเดียวกันการใช้ MMU จะทำให้มีค่าใช้จ่ายสูงถึง 30% (!!!) ในการแสดง เหตุใดจึงต้องใช้ MMU หากภาษาของคุณใช้งานอยู่แล้ว
Jörg W Mittag

1
ระบบปฏิบัติการ OS / 400 ทำงานในลักษณะเดียวกัน มีที่อยู่แฟลตเดียวเท่านั้นสำหรับทุกโปรแกรม และภาษาส่วนใหญ่ที่ใช้งานจริงในปัจจุบันมีคุณสมบัติด้านความปลอดภัยเหมือนกัน (ECMAScript, Java, C♯, VB.NET, PHP, Perl, Python, Ruby, Clojure, Scala, Kotlin, Groovy, Ceylon, F♯, OCaml ส่วน "วัตถุประสงค์" ของ "วัตถุประสงค์ -C", ส่วน "++" ของ "C ++") หากไม่ใช่สำหรับรหัส C ดั้งเดิมและคุณลักษณะดั้งเดิมของ C ++ และ Objective-C เราไม่ต้องการหน่วยความจำเสมือนอีกต่อไป
Jörg W Mittag

47

ฉันใช้งาน coroutines ในแอสเซมเบลอร์และประสิทธิภาพที่วัดได้

การสลับระหว่าง coroutines หรือที่เรียกว่ากระบวนการ Erlang ใช้เวลาประมาณ 16 คำสั่งและ 20 นาโนวินาทีบนโปรเซสเซอร์ที่ทันสมัย นอกจากนี้คุณมักรู้กระบวนการที่คุณกำลังเปลี่ยนไป (ตัวอย่าง: กระบวนการที่ได้รับข้อความในคิวสามารถดำเนินการได้โดยตรงจากกระบวนการเรียกไปสู่กระบวนการรับ) ดังนั้นตัวกำหนดตารางเวลาจะไม่เข้ามาเล่นทำให้ มันเป็นการดำเนินการ O (1)

ในการสลับเธรด OS จะใช้เวลาประมาณ 500-1,000 นาโนวินาทีเนื่องจากคุณกำลังเรียกใช้เคอร์เนล ตัวกำหนดตารางเวลาเธรด OS อาจทำงานในเวลา O (log (n)) หรือ O (log (log (n))) เวลาซึ่งจะเริ่มสังเกตเห็นได้ถ้าคุณมีหลายหมื่นหรือหลายล้านเธรด

ดังนั้นกระบวนการของ Erlang นั้นเร็วกว่าและปรับขนาดได้ดีกว่าเพราะทั้งการดำเนินการพื้นฐานของการสลับนั้นเร็วกว่า


33

กระบวนการ Erlang สอดคล้อง (โดยประมาณ) กับเธรดสีเขียวในภาษาอื่น ไม่มีการแยก OS ที่บังคับใช้ระหว่างกระบวนการ (อาจมีการแยกภาษาบังคับ แต่ก็มีการป้องกันที่น้อยกว่าแม้ว่า Erlang จะทำงานได้ดีกว่ามากที่สุด) เนื่องจากมันมีน้ำหนักเบากว่ามากจึงสามารถใช้งานได้กว้างขวางกว่า

ในทางกลับกันระบบปฏิบัติการเธรดสามารถกำหนดเวลาในคอร์ CPU ที่แตกต่างกันได้และ (ส่วนใหญ่) สามารถรองรับการประมวลผลที่ผูกกับ CPU ได้อย่างอิสระ กระบวนการของ OS นั้นเหมือนกับเธรด OS แต่มีการแยกที่บังคับใช้กับ OS ที่แข็งแกร่งกว่ามาก ราคาของความสามารถเหล่านี้คือเธรด OS และ (ยิ่งกว่านั้น) กระบวนการมีราคาแพงกว่า


อีกวิธีที่จะเข้าใจความแตกต่างก็คือ สมมติว่าคุณกำลังจะเขียนการใช้งานของ Erlang ด้านบนของ JVM (ไม่ใช่คำแนะนำที่บ้าโดยเฉพาะ) จากนั้นคุณจะทำให้แต่ละกระบวนการของ Erlang เป็นวัตถุที่มีบางสถานะ จากนั้นคุณจะมีกลุ่มของเธรดอินสแตนซ์ (โดยทั่วไปจะมีขนาดตามจำนวนแกนประมวลผลในระบบโฮสต์ของคุณนั่นคือพารามิเตอร์ที่ปรับได้ใน Erlang runtimes จริง BTW) ซึ่งรันกระบวนการ Erlang ในทางกลับกันที่จะกระจายงานที่จะต้องทำข้ามทรัพยากรระบบจริงที่มีอยู่ มันเป็นวิธีที่ค่อนข้างเรียบร้อยในการทำสิ่งต่าง ๆ แต่อาศัยอย่างเต็มที่ในความจริงที่ว่ากระบวนการ Erlang ของแต่ละคนไม่ได้ทำอะไรมาก ไม่เป็นไรแน่นอน Erlang มีโครงสร้างที่ไม่ต้องการให้แต่ละกระบวนการมีน้ำหนักมากเนื่องจากเป็นชุดรวมของกระบวนการที่เรียกใช้โปรแกรม

ในหลาย ๆ ทางปัญหาที่แท้จริงคือหนึ่งในคำศัพท์ สิ่งที่ Erlang เรียกกระบวนการ (และสอดคล้องอย่างยิ่งกับแนวคิดเดียวกันใน CSP, CCS และโดยเฉพาะอย่างยิ่ง calcul-แคลคูลัส) นั้นไม่เหมือนกับสิ่งที่ภาษาที่มีมรดกทางวัฒนธรรม C (รวมถึง C ++, Java, C # และ อื่น ๆ อีกมากมาย) เรียกกระบวนการหรือเธรด มีความคล้ายคลึงกันบางอย่าง (ทั้งหมดเกี่ยวข้องกับแนวคิดเรื่องการดำเนินการพร้อมกัน) แต่ไม่มีความเท่าเทียมกันแน่นอน ดังนั้นระวังเมื่อมีคนพูดว่า "กระบวนการ" กับคุณ พวกเขาอาจเข้าใจว่าหมายถึงสิ่งที่แตกต่างอย่างสิ้นเชิง ...


3
Erlang ไม่ได้อยู่ใกล้กับ Pi Calculus Pi แคลคูลัสถือว่าเหตุการณ์ซิงโครนัสผ่านช่องทางที่สามารถผูกกับตัวแปร แนวคิดแบบนี้ไม่เหมาะกับรุ่น Erlang เลย ลองเข้าร่วมแคลคูลัสซึ่งใกล้ชิดกับ Erlang ถึงแม้ว่ามันจะยังคงต้องสามารถเข้าร่วมในบางข้อความได้ มีกระดาษวิทยานิพนธ์ (และโครงการ) ชื่อว่า JErlang ซึ่งทำหน้าที่นำมาใช้
ฉันให้คำแนะนำที่น่ากลัว

ทุกอย่างขึ้นอยู่กับสิ่งที่คุณดูว่า pi-แคลคูลัสเป็น (และคุณสามารถจำลองช่องสัญญาณอะซิงโครนัสพร้อมช่องสัญญาณซิงโครนัสพร้อมกระบวนการบัฟเฟอร์)
Donal Fellows

คุณเพียงแค่บอกว่ากระบวนการ Erlang นั้นมีน้ำหนักเบา แต่คุณไม่ได้อธิบายว่าทำไมพวกเขาจึงมีขนาดเล็กกว่า (เบา) และทำไมประสิทธิภาพที่ดีกว่าเธรด OS
Jonas

1
@Jonas: สำหรับบางประเภทของงาน (โดยเฉพาะอย่างยิ่งการคำนวณงานหนัก) เธรด OS ทำได้ดีกว่า โปรดทราบว่างานเหล่านี้ไม่ใช่งานที่ Erlang ใช้ Erlang มุ่งเน้นไปที่การมีงานสื่อสารอย่างง่ายจำนวนมาก หนึ่งในผลประโยชน์จากการทำเช่นนั้นคือในกรณีของกลุ่มงานที่ส่งชิ้นส่วนรอบ ๆ และรอผลซึ่งสามารถทำได้ในเธรด OS เดี่ยวบนตัวประมวลผลเดียวซึ่งมีประสิทธิภาพมากกว่า มีการสลับบริบท
Donal Fellows

ในทางทฤษฎีคุณสามารถทำให้เธรด OS มีราคาถูกมากด้วยการใช้สแต็กขนาดเล็กมากและควบคุมจำนวนของทรัพยากรเฉพาะเธรดอื่น ๆ ที่จัดสรรไว้อย่างระมัดระวัง แต่นั่นเป็นปัญหาในทางปฏิบัติ (การคาดการณ์ความต้องการสแต็กเป็นบิตของงานศิลปะสีดำ) ดังนั้นเธรด OS จึงได้รับการออกแบบมาโดยเฉพาะเพื่อให้เหมาะสมที่สุดในกรณีที่มีจำนวนน้อยกว่า (ตามลำดับจำนวนคอร์ CPU) และตำแหน่งที่สำคัญกว่า จำนวนการประมวลผลแต่ละ
Donal Fellows

3

ฉันคิดว่า Jonas ต้องการตัวเลขจำนวนหนึ่งในการเปรียบเทียบเธรด OS กับกระบวนการ Erlang ผู้เขียนโปรแกรม Erlang โจ Armstrong กลับมาทดสอบความยืดหยุ่นของการวางไข่ของกระบวนการ Erlang กับเธรด OS เขาเขียนเว็บเซิร์ฟเวอร์อย่างง่ายใน Erlang และทดสอบกับ Apache แบบมัลติเธรด (ตั้งแต่ Apache ใช้เธรด OS) มีเว็บไซต์เก่าที่มีข้อมูลย้อนหลังไปถึงปี 1998 ฉันจัดการเพื่อค้นหาเว็บไซต์นั้นเพียงครั้งเดียวเท่านั้น ดังนั้นฉันจึงไม่สามารถให้ลิงค์ แต่ข้อมูลก็อยู่ตรงนั้น ประเด็นหลักของการศึกษาแสดงให้เห็นว่า Apache ขยายสูงสุดภายใต้กระบวนการ 8K ในขณะที่เซิร์ฟเวอร์ Erlang ที่เขียนด้วยมือของเขาจัดการกระบวนการ 10K +


5
ฉันคิดว่าคุณกำลังพูดถึงเรื่องนี้: sics.se/~joe/apachevsyaws.htmlแต่ฉันถามว่า erlang ทำให้เธรดมีประสิทธิภาพได้อย่างไรเมื่อเทียบกับเธรด kerlenl
Jonas

@ ลิงก์ Jonas ตายไปแล้ว ภาพรวมสุดท้ายคือที่นี่
อัลบากรัม

1
บทความกล่าวว่า: "Apache เสียชีวิตที่ประมาณ 4,000 ช่วงคู่ขนาน Yaws ยังคงทำงานที่การเชื่อมต่อแบบขนานมากกว่า 80,000 รายการ"
นาธานลอง

ดูบทความฉบับเต็มได้ที่citeseerx.ist.psu.edu/viewdoc/ ...... ที่จริงแล้วมันเป็นไปไม่ได้ที่จะทำลายเซิร์ฟเวอร์ Erlang ด้วยการโจมตี 16 เครื่อง - แม้ว่ามันจะง่ายต่อการหยุดเซิร์ฟเวอร์ Apache
Bernhard

1

เนื่องจากล่าม Erlang เพียง แต่ต้องกังวลเกี่ยวกับตัวเองระบบปฏิบัติการจึงมีสิ่งอื่น ๆ อีกมากมายที่ต้องกังวล


0

หนึ่งในเหตุผลคือกระบวนการ erlang ไม่ได้สร้างขึ้นในระบบปฏิบัติการ แต่อยู่ใน evm (เครื่องเสมือน erlang) ดังนั้นค่าใช้จ่ายจึงน้อยลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.