ทำความเข้าใจกับเธรดพูล. Net CLR

ใน. Net Framework CLR มีหน้าที่รับผิดชอบในการจัดการทรัพยากรเพื่อรันแอปพลิเคชัน โดยเฉพาะอย่างยิ่งพูลเธรด CLR จะกำหนดว่าเมื่อใดที่จะเพิ่มหรือนำเธรดออกไป การทำความเข้าใจวิธีการทำงานจะช่วยให้คุณกำหนดวิธีกำหนดค่าแอปพลิเคชัน ASP.Net ของคุณเพื่อประสิทธิภาพสูงสุด

เธรดพูล CLR ประกอบด้วยเธรดสองชนิด - เธรดของผู้ปฏิบัติงานและพอร์ตการเสร็จสิ้น I / O หรือเธรด IOCP นั่นหมายความว่ากระบวนการผู้ปฏิบัติงาน ASP.Net ของคุณมีพูลเธรดสองเธรดพูลเธรดของผู้ปฏิบัติงานและเธรดพูล IOCP ตามธรรมชาติแล้วสระว่ายน้ำเหล่านี้มีวัตถุประสงค์ที่แตกต่างกัน

เมื่อคุณใช้วิธีการเช่นTask.Run, TaskFactory.StartNewและThreadPool.QueueUserWorkItemรันไทม์ใช้ประโยชน์จากเธรดสำหรับการประมวลผล เมื่อคุณทำการเรียก I / O แบบอะซิงโครนัสในแอปพลิเคชันของคุณหรือแอปพลิเคชันของคุณเข้าถึงระบบไฟล์ฐานข้อมูลบริการเว็บ ฯลฯ รันไทม์จะใช้เธรด IOCP โปรดทราบด้วยว่าแต่ละโดเมนของแอ็พพลิเคชันมีเธรดพูลของตัวเอง

มาดูวิธีการสร้างและลบเธรดเหล่านี้ใน. Net Framework 

กลยุทธ์การร้อยไหม

เธรดพูล. Net เริ่มฉีดเธรดใหม่เมื่อใดก็ตามที่จำนวนเธรดที่ไม่ว่างจะเท่ากับจำนวนเธรดขั้นต่ำที่กำหนดค่าไว้ในเธรดพูล ค่าดีฟอลต์ของการตั้งค่าขั้นต่ำซึ่งเป็นจำนวนขั้นต่ำของ  ทั้ง  ผู้ปฏิบัติงานและเธรด IOCP ถูกกำหนดโดยจำนวนตัวประมวลผลในระบบของคุณ ดังนั้นหากระบบของคุณมีสี่คอร์คุณจะมีเธรดผู้ปฏิบัติงานสี่เธรดและเธรด IOCP สี่เธรดตามค่าเริ่มต้น 

จากนั้นเธรดพูล. Net จะฉีดเธรดผู้ปฏิบัติงานเพิ่มเติมตามความต้องการหากเธรดที่มีอยู่ถูกใช้และยังมีงานที่ต้องทำ ในทำนองเดียวกันโทเค็นหากความต้องการทรัพยากรลดลงเธรดพูลจะเริ่มนำเธรดออกไป 

การเรียกใช้ข้อมูลโค้ดต่อไปนี้จะแสดงจำนวนของตัวประมวลผลเชิงตรรกะในระบบของคุณและจำนวนขั้นต่ำของผู้ปฏิบัติงานและเธรด IOCP ที่มีอยู่

โมฆะคงที่หลัก (สตริง [] args)

{

    int MinimumWorkerThreadCount, MinimumIOCThreadCount;

      int logicalProcessorCount = System.Environment.ProcessorCount;

      ThreadPool.GetMinThreads (out minimumWorkerThreadCount, out minimumIOCThreadCount);

      Console.WriteLine (“ หมายเลขของโปรเซสเซอร์:“ + logicalProcessorCount);

     Console.WriteLine (“ จำนวนขั้นต่ำของเธรดผู้ปฏิบัติงาน:“ + minimumWorkerThreadCount);

      Console.WriteLine (“ จำนวนขั้นต่ำของเธรด IOCP:“ + ขั้นต่ำIOCThreadCount);

      Console.Read ();

}

เธรดพูล. Net จัดการเธรดโดยใช้ฮิวริสติกในตัว กลยุทธ์ที่นำมาใช้ ได้แก่ การหลีกเลี่ยงความอดอยากและอัลกอริทึมการปีนเขา ในกรณีก่อนหน้านี้เธรดพูล. Net จะยังคงเพิ่มเธรดของผู้ปฏิบัติงานหากไม่มีความคืบหน้าที่มองเห็นได้ในรายการที่อยู่ในคิว ในกรณีหลังนี้เธรดพูล. Net จะพยายามเพิ่มปริมาณงานให้มากที่สุดโดยใช้เธรดให้น้อยที่สุด

เธรดพูล. Net จะฉีดหรือลบเธรดในช่วงเวลา 500 มิลลิวินาทีหรือเมื่อเธรดเป็นอิสระแล้วแต่ว่ากรณีใดจะเกิดขึ้นก่อน ตอนนี้ขึ้นอยู่กับคำติชมที่มีให้กับรันไทม์พูลเธรด. Net จะลบเธรดหรือเพิ่มเธรดเพื่อเพิ่มปริมาณงานสูงสุด หากการเพิ่มเธรดไม่เพิ่มทรูพุตก็จะทำให้เธรดหายไป นี่คือเทคนิคการปีนเขาของ CLR ที่ใช้งานจริง

สมมติว่าคุณกำลังเรียกใช้แอปพลิเคชัน ASP.Net บน IIS และเว็บเซิร์ฟเวอร์ของคุณมีซีพียูทั้งหมดสี่ตัว สมมติว่า ณ เวลาใดเวลาหนึ่งมีคำขอ 24 รายการที่ต้องดำเนินการ ตามค่าเริ่มต้นรันไทม์จะสร้างเธรดสี่เธรดซึ่งจะพร้อมใช้งานสำหรับสี่คำร้องขอแรก เนื่องจากจะไม่มีการเพิ่มเธรดเพิ่มเติมจนกว่าจะผ่านไป 500 มิลลิวินาทีคำขออีก 20 รายการจะต้องรอในคิว หลังจากผ่านไป 500 มิลลิวินาทีเธรดใหม่จะถูกสร้างขึ้น

อย่างที่คุณเห็นจะใช้เวลาหลาย 500 มิลลิวินาทีเพื่อให้ทันกับภาระงาน นี่เป็นเหตุผลที่ดีสำหรับการใช้การเขียนโปรแกรมแบบอะซิงโครนัส ด้วยการเขียนโปรแกรมแบบ async เธรดจะไม่ถูกบล็อกในขณะที่มีการจัดการคำขอดังนั้นเธรดทั้งสี่จะได้รับการปลดปล่อยเกือบจะในทันที 

การตั้งค่าเธรดที่แนะนำ

เมื่อพิจารณาถึงวิธีการทำงานของเธรดพูล. Net และสิ่งที่เราได้พูดถึงไปแล้วขอแนะนำอย่างยิ่งให้คุณเปลี่ยนค่าการกำหนดค่าขั้นต่ำซึ่งเป็นค่าเริ่มต้นสำหรับทั้งเธรดผู้ปฏิบัติงานและ IOCP ในการดำเนินการนี้ใน ASP.Net คุณควรเปลี่ยนการตั้งค่าminWorkerThreadsและminIoThreadsการกำหนดค่าภายใต้องค์ประกอบการกำหนดค่าในไฟล์ machine.config ในระบบของคุณ

           minIoThreads =” ระบุค่าที่คุณต้องการที่นี่” />

คุณสามารถตั้งค่าการกำหนดค่าขั้นต่ำสำหรับทั้งเธรดผู้ปฏิบัติงานและ IOCP เป็นค่าใดก็ได้ระหว่างหนึ่งถึง 50 แนวทางที่ดีคือการถ่ายโอนข้อมูลกระบวนการโหมดผู้ใช้ของกระบวนการผู้ปฏิบัติงาน IIS (W3wp.exe) จากนั้นใช้!threadpoolคำสั่งเพื่อรายงาน จำนวนเธรดผู้ปฏิบัติงานทั้งหมด เมื่อคุณทราบค่านี้แล้วให้หารด้วยจำนวนแกนประมวลผลบนระบบของคุณเพื่อกำหนดค่าผู้ปฏิบัติงานขั้นต่ำและการตั้งค่าเธรด IOCP ตัวอย่างเช่นหากจำนวนเธรดผู้ปฏิบัติงานทั้งหมดเท่ากับ 100 และคุณมีตัวประมวลผลสี่ตัวในระบบของคุณคุณสามารถตั้งค่าต่ำสุดสำหรับทั้งเธรดของผู้ปฏิบัติงานและ IOCP เป็น 25

หากต้องการเปลี่ยนการตั้งค่าเธรดขั้นต่ำเริ่มต้นภายนอก ASP.Net คุณสามารถใช้ThreadPool.SetMinThreads()วิธีการ

ด้วยเป้าหมายของการจัดการเธรดที่ดีขึ้นและประสิทธิภาพที่ดีขึ้นพูลเธรด CLR จึงได้รับการปรับปรุงให้ดีขึ้นกับ CLR แต่ละเวอร์ชัน ตัวอย่างเช่นด้วย. Net Framework 4 CLR ได้รับอัลกอริธึมการขโมยเธรดและรองรับการทำงานพร้อมกันและแบบขนาน ด้วย CLR เวอร์ชันใหม่แต่ละชุดเธรดพูล. Net จะฉลาดขึ้นเกี่ยวกับการเพิ่มประสิทธิภาพทรูพุตโดยการสร้างและทำลายเธรดตามต้องการ ในระหว่างนี้คุณจะต้องทดลองกับการตั้งค่าเธรดขั้นต่ำที่แตกต่างกันเพื่อให้ได้ประสิทธิภาพที่ดีที่สุดจากแอปพลิเคชัน. Net ของคุณ