วิธีการ "อุ่นเครื่อง" Entity Framework “ หนาว” เมื่อไหร่


118

ไม่คำตอบสำหรับคำถามที่สองของฉันไม่ใช่ฤดูหนาว

คำนำ:

เมื่อเร็ว ๆ นี้ฉันได้ทำการวิจัยเกี่ยวกับ Entity Framework มากมายและสิ่งที่ทำให้ฉันรำคาญคือประสิทธิภาพของมันเมื่อแบบสอบถามไม่ได้อุ่นเครื่องเรียกว่าแบบสอบถามเย็น

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

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

โดยพื้นฐานแล้วสิ่งที่ฉันสังเกตเห็นคือเมื่อใดก็ตามที่ฉันต้องทำการคอมไพล์ใหม่หรือการรีไซเคิลการค้นหาครั้งแรกของฉันจะช้ามาก การอ่านข้อมูลใด ๆ ที่ตามมานั้นรวดเร็ว ( อัตนัย ) ตามที่คาดไว้

เราจะย้ายไปใช้ Windows Server 2012, IIS8 และ SQL Server 2012 และในฐานะ Junior ฉันได้รับโอกาสในการทดสอบก่อนที่จะเหลือ ฉันดีใจมากที่พวกเขาแนะนำโมดูลการอุ่นเครื่องซึ่งจะทำให้แอปพลิเคชันของฉันพร้อมสำหรับคำขอแรกนั้น อย่างไรก็ตามฉันไม่แน่ใจว่าจะดำเนินการอย่างไรกับการอุ่นเครื่อง Entity Framework ของฉัน

สิ่งที่ฉันรู้แล้วว่าควรค่าแก่การทำ:

  • สร้างมุมมองของฉันล่วงหน้าตามที่แนะนำ
  • ในที่สุดก็ย้ายโมเดลของฉันไปไว้ในชุดประกอบแยกต่างหาก

สิ่งที่ฉันคิดจะทำโดยใช้สามัญสำนึกอาจเป็นแนวทางที่ผิด :

  • การอ่านข้อมูลจำลองที่ Application Start เพื่ออุ่นเครื่องสร้างและตรวจสอบโมเดล

คำถาม:

  • อะไรคือแนวทางที่ดีที่สุดในการมีความพร้อมใช้งานสูงใน Entity Framework ของฉันได้ตลอดเวลา
  • Entity Framework จะ "เย็น" อีกครั้งในกรณีใดบ้าง (การคอมไพล์การรีไซเคิลการรีสตาร์ท IIS เป็นต้น)

พิจารณาว่านี่เป็นการสร้างมุมมองหรือการรวบรวมคำค้นหาที่โดนใจคุณมากที่สุด หากนี่คือ view gen ให้ใช้มุมมองที่คอมไพล์ไว้ล่วงหน้า หากนี่คือข้อความค้นหาคุณมีลำดับชั้นที่ซับซ้อนมากหรือไม่? โปรดทราบว่าสิ่งที่มีราคาแพงมักเกิดขึ้นเพียงครั้งเดียวต่อโดเมนของแอปและจะถูกแคชดังนั้นคุณจะเห็นปัญหาประเภทนี้เมื่อมีการยกเลิกการโหลดโดเมนของแอปและมีการสร้างโดเมนใหม่
Pawel

ฉันได้พูดถึงการสร้างมุมมองแล้ว @Pawel ลำดับชั้นไม่ซับซ้อนไม่แม้แต่นิดเดียว แต่ปัญหาคือเงินต้นเช่นกัน ตามสิ่งที่คุณพูดฉันจะค้นคว้าเมื่อโดเมนของแอปถูกยกเลิกการโหลด อย่างไรก็ตามนั่นยังไม่ช่วยปัญหาอื่น ๆ ที่ทำให้ Entity Framework ร้อนขึ้นในกรณีเช่นที่คุณพูดโดเมนแอปจะถูกยกเลิกการโหลด ในตอนนี้ดูเหมือนว่าโดเมนของแอปจะถูกยกเลิกการโหลดมากกว่าที่ควรจะเป็นและฉันไม่แน่ใจว่าทำไมการรีไซเคิลจึงมีเฉพาะในตอนกลางคืนเท่านั้นโดยตั้งค่าไม่ทำงานเป็น 0
ปีเตอร์

4
ทำไมคุณถึงคิดว่าการอ่านข้อมูลหลอกเป็นแนวทางที่ผิด?
Josh Heitzman

5
มันรู้สึกไม่ถูกต้องฉันคิดว่าอาจมีบางอย่างที่หรูหรากว่าที่ฉันไม่รู้ แต่ถ้านั่นเป็นทางออกเดียวและคนที่มีความรู้ดีสามารถยืนยันได้ว่าไม่มีทางอื่นฉันจะไปด้วย
ปีเตอร์

1
ปัญหาหนึ่งที่ฉันพบเมื่อแอปพูลปิดตัวลงหลังจากช่วงเวลาที่ไม่มีกิจกรรม (เนื่องจากมีปริมาณการใช้งานน้อย) คือการสร้างบริการที่ส่งคำขอในช่วงเวลาที่กำหนดไปยังหน้าใดหน้าหนึ่งของคุณ ซึ่งจะป้องกันไม่ให้เกิดความล่าช้าเป็นเวลานานก่อนที่พูลแอปจะรีสตาร์ทตามคำขอแรก หรือคุณสามารถใช้บริการฟรีเช่น www.pingalive.com เพื่อ ping โดเมน / ip ของคุณ นอกจากนี้ยังช่วยป้องกันไม่ให้วัตถุแคชของคุณถูกล้างก่อนที่จะหมดอายุ
hatsrumandcode

คำตอบ:


55
  • อะไรคือแนวทางที่ดีที่สุดในการมีความพร้อมใช้งานสูงใน Entity Framework ของฉันได้ตลอดเวลา

คุณสามารถใช้มุมมองที่สร้างไว้ล่วงหน้าและแบบสอบถามที่รวบรวมแบบคงที่

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

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

อย่าใช้การสืบทอด TPT จำนวนมาก (ซึ่งเป็นปัญหาด้านประสิทธิภาพโดยทั่วไปใน EF) อย่าสร้างลำดับชั้นการสืบทอดของคุณให้ลึกเกินไปหรือกว้างเกินไป คุณสมบัติเพียง 2-3 คุณสมบัติเฉพาะสำหรับบางคลาสอาจไม่เพียงพอที่จะต้องใช้ประเภทของตัวเอง แต่สามารถจัดการเป็นคุณสมบัติทางเลือก (ว่างได้) สำหรับประเภทที่มีอยู่

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

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

  • Entity Framework จะ "เย็น" อีกครั้งในกรณีใดบ้าง (การคอมไพล์การรีไซเคิลการรีสตาร์ท IIS เป็นต้น)

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

ฉันยังถือว่าเมื่อคุณเปลี่ยนไฟล์กำหนดค่าหรือเปลี่ยนแอสเซมบลีจะต้องรีสตาร์ท


ขอบคุณอังเดรนั่นคือสิ่งที่ฉันต้องการ
ปีเตอร์

@Andreas จริงๆแล้วแม้จะมีแบบสอบถามที่คอมไพล์แบบคงที่ แต่การรันครั้งแรกก็ยาวเกินไป มีวิธีใดบ้างในการอุ่นเครื่องนอกเหนือจาก: การอ่านข้อมูลจำลองที่ Application Start เพื่ออุ่นเครื่องสร้างและตรวจสอบโมเดล
manishKungwani

@Andreas ดังนั้น Entity framework5 จำเป็นหรือไม่? จะแตกต่างกันอย่างไรถ้าใช้กับ ef5 (ฉันหมายถึงยังคงช้าหรือปะทะน้อยหรือไม่แตกต่างกัน)
qakmak

"Static CompiledQuerys เป็นสิ่งที่ดีเพราะเขียนได้ง่ายและรวดเร็วและช่วยลดประสิทธิภาพ" ประสิทธิภาพลดลง?
Mathemats

9

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

โดยทั่วไปคุณควรพยายามออกแบบสถาปัตยกรรมแบบกระจายเพื่อต้องการเฉพาะคำขอข้อมูลที่อิง IO เมื่อข้อมูลที่แคชไว้ในเครื่องกลายเป็นข้อมูลเก่าหรือจำเป็นต้องทำธุรกรรม โดยปกติคำขอข้อมูล "over the wire" จะใช้เวลาในการดึงข้อมูลนานกว่าการดึงข้อมูลแคชในหน่วยความจำ 10-1000 เท่า ข้อเท็จจริงเพียงอย่างเดียวนี้มักทำให้การอภิปรายเกี่ยวกับ "ข้อมูลเย็นและข้อมูลอุ่น" ไม่สำคัญเมื่อเปรียบเทียบกับปัญหาข้อมูล "ในพื้นที่เทียบกับระยะไกล"


นี่เป็นจุดที่ดีที่ฉันมักจะละเลยในขณะที่ได้รับความสนใจเกี่ยวกับประสิทธิภาพดิบของกรอบงานเอนทิตี ฉันจะตรวจสอบเพิ่มเติมและค้นคว้าเพิ่มเติมเกี่ยวกับหลักการของการแคช อย่างไรก็ตาม "เย็นกับอบอุ่น" ในแง่ของ EF ยังคงเป็นสิ่งที่ฉันต้องการทำความเข้าใจให้ดีขึ้น
Peter

2
"ข้อเท็จจริงนี้เพียงอย่างเดียวมักทำให้การอภิปรายเกี่ยวกับ" ข้อมูลเย็นและข้อมูลอุ่น "ไม่สำคัญเมื่อเปรียบเทียบกับปัญหาข้อมูล" ในพื้นที่เทียบกับระยะไกล "" ไม่จริง หากคุณไม่มีแคชไว้ในเครื่อง (ซึ่งคุณจะทำไม่ได้ในตอนแรก) คุณจะยังต้องกด EF และต้องทนทุกข์ทรมานจากความเจ็บปวดในการเริ่มต้นเพื่อที่จะกำหนดแคชของคุณ สถานที่เดียวกับที่แคชของคุณไม่ได้กำหนดค่าเริ่มต้น EF จะไม่ได้เริ่มต้น ดังนั้นการเพิ่มเลเยอร์ของการแคชอาจไม่ช่วยหากปัญหาเดียวคือเวลาเริ่มต้น EF แต่จะเพิ่มความซับซ้อนอีกชั้น ...
MikeJansen

8

เคล็ดลับทั่วไป

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

ตอนนี้จะอธิบายว่าทำไมการร้องขอหุ่นไม่ได้วิธีการที่ไม่ถูกต้อง

  • น้อยซับซ้อน - คุณจะร้อนขึ้นการประยุกต์ใช้ในลักษณะที่จะทำงานโดยไม่คำนึงถึงการเปลี่ยนแปลงในกรอบที่และคุณไม่ต้องคิดออก APIs อาจจะขี้ขลาด / internals กรอบที่จะทำวิธีการที่เหมาะสม
  • ความครอบคลุมที่มากขึ้น - คุณกำลังอุ่นทุกชั้นของการแคชพร้อมกันที่เกี่ยวข้องกับคำขอที่ช้า

เพื่ออธิบายเมื่อแคชกลายเป็น "เย็น"

เรื่องนี้เกิดขึ้นที่ชั้นใด ๆ ในกรอบของคุณที่ใช้แคชมีคำอธิบายที่ดีที่ด้านบนของหน้าผลการดำเนินงาน

  • เมื่อใดที่ต้องตรวจสอบความถูกต้องของแคชหลังจากการเปลี่ยนแปลงที่อาจทำให้แคชเก่าอาจเป็นการหมดเวลาหรือชาญฉลาดมากขึ้น (เช่นการเปลี่ยนแปลงในรายการที่แคช)
  • เมื่อรายการแคชถูกขับไล่อัลกอริทึมสำหรับการดำเนินการนี้จะอธิบายไว้ในส่วน "อัลกอริทึมการขับแคช" ในบทความประสิทธิภาพที่คุณเชื่อมโยงแต่สั้น ๆ
    • แคช LFRU (ใช้น้อยที่สุด - เพิ่งใช้ล่าสุด) สำหรับจำนวนการโจมตีและอายุที่ จำกัด ไว้ที่ 800 รายการ

สิ่งอื่น ๆ ที่คุณกล่าวถึงโดยเฉพาะการคอมไพล์ใหม่และการรีสตาร์ท IIS ล้างแคชในหน่วยความจำทั้งส่วนหรือทั้งหมด


นี่เป็นอีกหนึ่งคำตอบที่เป็นประโยชน์ชื่นชมมาก
ปีเตอร์

3

ตามที่คุณได้ระบุไว้ให้ใช้ "มุมมองที่สร้างไว้ล่วงหน้า" ซึ่งเป็นสิ่งที่คุณต้องทำจริงๆ

ดึงมาจากลิงก์ของคุณ: "เมื่อมีการสร้างมุมมองจะมีการตรวจสอบความถูกต้องด้วยจากมุมมองด้านประสิทธิภาพต้นทุนส่วนใหญ่ของการสร้างการดูคือการตรวจสอบความถูกต้องของการดู"

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

การดำเนินการสืบค้นที่ไม่เกี่ยวข้องจะไม่มีจุดประสงค์อื่นใดนอกจากการใช้ทรัพยากรระบบ

ทางลัด ...

  1. ข้ามงานพิเศษทั้งหมดของการดูที่สร้างไว้ล่วงหน้า
  2. สร้างบริบทวัตถุของคุณ
  3. ดับข้อความค้นหาที่ไม่เกี่ยวข้องอันแสนหวาน
  4. จากนั้นให้อ้างอิงบริบทวัตถุของคุณตลอดระยะเวลาของกระบวนการของคุณ (ไม่แนะนำ)

3
ตรวจสอบเรื่องนี้: การใช้แม่แบบ T4 สำหรับดูรุ่น
kzfabi

2

ฉันไม่มีประสบการณ์ในกรอบนี้ แต่ในบริบทอื่น ๆ เช่น Solr การอ่านดัมมี่โดยสมบูรณ์จะไม่มีประโยชน์มากนักเว้นแต่คุณจะแคช DB (หรือดัชนี) ทั้งหมด

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

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