เซิร์ฟเวอร์ต้องการ RAM จริงเท่าใด


12

ฉันมีเซิร์ฟเวอร์ไม่กี่ตัวที่ติดตั้งทั่วโลก พวกเขากำลังเรียกใช้ Windows 2003 x64 พร้อม SQL Server 2005 x64 พร้อม RAM ขนาด 6 GB กล่องไม่ได้มีการกำหนดค่าที่ดีที่สุด (หรือแม้แต่ยอมรับได้) เพราะคนที่สั่งให้พวกเขาเมื่อหลายปีก่อนไม่รู้จริง ๆ ว่าเขากำลังทำอะไรอยู่

กล่องนั้นมีหน่วยความจำไม่พอสมควรจบลงด้วยการใช้ไฟล์เพจจิ้งและทุกอย่างช้าลง โดยทั่วไปแล้วค่าคอมมิชชั่นคือ 5.8GB จากนั้นเมื่อมีคนต้องการทำอะไรที่เข้มข้น (เช่นเรียกใช้รายงาน) หมายเลขนั้นจะผ่านหลังคา

ฉันพยายามรับพลังที่สั่งหน่วยความจำเพิ่มขึ้น แต่ฉันได้รับการคัดค้านอย่างมาก (เช่นทำให้ซอฟต์แวร์มีประสิทธิภาพมากขึ้นมีค่าใช้จ่ายมากเกินไปสำหรับเซิร์ฟเวอร์เหล่านี้ทั้งหมดหรือพิสูจน์ว่ากล่องนั้นมีหน่วยความจำไม่เพียงพอ ฯลฯ .. )

มีแนวทาง (หรือสูตร) ​​สำหรับกล่องแรมที่ต้องการให้ฉันนำเสนอให้กับผู้ที่ไม่ใช้เทคโนโลยีเพื่อให้เราสามารถสั่งหน่วยความจำได้มากขึ้นหรือไม่?


มีการพัฒนาระบบขึ้นหรือไม่
Oskar Duveborn

@Oskar ใช่ฉันเป็นนักพัฒนาและรหัสได้รับการปรับให้เหมาะกับนรกและย้อนกลับ มีข้อมูลมากมาย
AngryHacker

จากนั้นดูคำตอบของฉัน นี่คือสิ่งที่ฉันเชี่ยวชาญ
mrdenny

คำตอบ:


9

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

ข้อ จำกัด ที่เกิดขึ้นจริงมีความชัดเจนในสถานการณ์ของคุณ คุณกำลังวิ่งไปสักพักบนกิ๊กที่ 6 โดยไม่มีปัญหาจากนั้นมันก็เปลี่ยนและ thrashing ดังนั้น 6 กิ๊กก็ไม่เพียงพอ

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

คุณจะไม่ทราบจำนวนหน่วยความจำที่แน่นอนที่คุณต้องการจนกว่าคุณจะนำไปใช้จริงในการใช้งานจริงและทำงานจากที่นั่น

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

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


จำเป็นต้องใช้ขนาดและสถิติ +1
Oskar Duveborn

12

วิธีง่ายๆในการดูว่าคุณต้องการ RAM เพิ่มขึ้นหรือไม่ให้ทำแผนภูมิตัวนับจำนวนหน้าของอายุการใช้งานหน้า ตัวนับนี้จะบอกคุณว่า SQL Server คิดว่าข้อมูลจะถูกเก็บไว้ในบัฟเฟอร์พูลนานเท่าใดก่อนที่จะต้องมีที่ว่างสำหรับข้อมูลอื่น คุณต้องการหมายเลขนี้สูงที่สุด ด้วยการติดตั้ง RAM 6 Gigs (คุณควรตั้งค่า SQL ให้สูงสุดที่ 4 gigs) คุณอาจจะเก็บข้อมูลไว้ในหน่วยความจำเพียงไม่กี่นาทีเมื่อมีคนใช้งานรายงานขนาดใหญ่คุณจะเห็นถังจำนวนมาก ลงไปไม่กี่วินาที ยิ่งคุณมี RAM มากเท่าใดข้อมูลก็จะถูกเก็บไว้ในหน่วยความจำนานขึ้นและการอ่านจากดิสก์ที่น้อยลงก็จำเป็นต้องทำ

ตัวอย่างเช่นระบบที่ฉันทำงานด้วยในขณะนี้มี RAM 256 Gigs และเราเก็บข้อมูลในหน่วยความจำประมาณ 12000 วินาทีหรือมากกว่านั้น

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


6

hmmmm 6 กิ๊กนั้นเป็น ram ที่เหมาะสมแม้กระทั่งกับการติดตั้ง MSSQL ขนาดใหญ่ คุณอาจต้องการตรวจสอบและตรวจสอบให้แน่ใจว่ารหัสของคุณมีประสิทธิภาพจริงๆ ธุรกรรม 6 กิ๊กเป็นเรื่องผิดปกติเล็กน้อย ... ฉันได้ทำงานในระบบบัญชีเงินเดือนของรัฐที่ไม่ได้ติดอันดับต้นปี 1099 ในการประมวลผล ... และมีการเรียกใช้บ่อยครั้งหรือไม่ ฉันไม่รู้ คุณทำงานกับข้อมูลประเภทใด

ที่ถูกกล่าวว่าคุณสามารถ RAM ได้มากเท่าที่คุณต้องการในกล่อง 64 บิตและ RAM มีราคาถูกดังนั้นคุณอาจใส่มากในนั้นเท่าที่คุณจะทำได้ ... ไม่สามารถมี RAM มากเกินไปบน เซิร์ฟเวอร์ฐานข้อมูล

แก้ไข: นี่ล้าสมัยแล้ว ฉันมีกล่อง MSSQL พร้อม RAM 256 กิกะไบต์


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

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

1
@robert: ฉันเห็นด้วย แต่บ่อยครั้งที่ฉันเห็นผู้คนใช้จ่ายโคเดอร์และที่ปรึกษาหลายพันคนเพื่อแก้ไขปัญหาซอฟต์แวร์เมื่อใช้ฮาร์ดแวร์เพิ่มอีกนิดหน่อยก็จะทำสิ่งเดียวกันในราคาที่ถูก
Satanicpuppy

1
6 Gigs เป็นขนาดที่ดีของหน่วยความจำ SQL Server หรือไม่? คุณใช้เซิร์ฟเวอร์ขนาดเล็กที่สวยงามอยู่แล้ว ฉันมีกล่องที่ติดตั้ง 256 Gigs และฉันมีเพื่อนที่ติดตั้ง 512 Gigs 6 กิ๊กนั้นคืออะไร
mrdenny

1
@mdmarra: เอ๊ะ ในปี 2012 แน่นอน ในปี 2009? ไม่เท่าไร.
Satanicpuppy

4

ก่อนที่คุณจะกระโดดปืนเพื่อซื้อหน่วยความจำเพิ่มเติม (หรือส่วนประกอบอื่น ๆ ) ฉันขอแนะนำให้ใช้การวิเคราะห์ประสิทธิภาพบนเซิร์ฟเวอร์ คุณสามารถทำได้ด้วยตนเองโดยใช้ perfmon หรือดูที่การใช้เครื่องมือของบุคคลที่สาม คุณควรวิเคราะห์ประสิทธิภาพของทั้งระบบปฏิบัติการและเซิร์ฟเวอร์ SQL IMHO บ่อยครั้งที่เราพร้อมที่จะทิ้งฮาร์ดแวร์ไว้ที่ปัญหาก่อนที่จะทำการวิเคราะห์ที่เหมาะสม สำหรับสิ่งที่คุณรู้ ณ จุดนี้มันอาจเป็นปัญหากับแบบสอบถามขั้นตอนการจัดเก็บแผนปฏิบัติการดิสก์ I / O การใช้งาน CPU ฯลฯ ความดันหน่วยความจำมักจะเป็นอาการของคอขวดอื่นในระบบ


1

ตามที่ "Satanicpuppy" กล่าวว่าไม่มีสิ่งใดเป็น RAM มากเกินไป แต่ 6GB ควรจะโอเคบางทีคุณควรคิดใหม่เกี่ยวกับสิ่งที่เซิร์ฟเวอร์ของคุณทำฉันไม่คิดว่าคุณมีปัญหา "ฮาร์ดแวร์" คุณควร มุ่งเน้นการเขียนโปรแกรม SQL ของคุณ ...


1

เมื่อพูดถึงเซิร์ฟเวอร์ฐานข้อมูลไม่มีสิ่งใดในหน่วยความจำ "พอ" แน่นอนว่ามันขึ้นอยู่กับสิ่งที่พวกเขาทำและเรียกใช้จริง แต่ถ้ามันเป็นฐานข้อมูลที่ใช้อย่างต่อเนื่องซึ่งมีข้อมูลจำนวนมากและทำแบบสอบถามที่ซับซ้อน - 6 GB อาจไม่เพียงพออย่างไม่มีการลด

ฉันจะเริ่มต้นด้วยการอัพเกรดเซิร์ฟเวอร์ที่มีปัญหาหนึ่งเครื่องเป็นอย่างน้อย 32 หรือ 64 GB และดูว่าช่วยได้หรือไม่ ถ้าไม่ให้เปลี่ยนไปใช้การปรับแต่งฐานข้อมูลการแก้ไขปัญหาแอพพลิเคชั่นและการแก้ไขข้อบกพร่อง - ซึ่งทั้งหมดยกเว้นว่าคนงี่เง่าออกแบบฐานข้อมูลเสียค่าใช้จ่ายมากกว่าสองสามหน่วยความจำระดับเซิร์ฟเวอร์ (และแม้ว่าคนบ้าออกแบบสิ่งนั้น แก้ไขข้อผิดพลาดด้วยการสนับสนุนที่คงอยู่สามารถพิสูจน์ได้ว่าเป็นการท้าทาย)

ที่กล่าวว่าตามที่คนอื่นระบุ - อาจเป็นอย่างอื่นถือกลับ (นอกเหนือจากปัญหาการออกแบบซอฟต์แวร์) เช่นการขาดดิสก์หรือประสิทธิภาพ I / O เครือข่าย - จ้าง DBA pro เพียงผ่านการตรวจสอบประสิทธิภาพ SQL พื้นฐานสำหรับ วันสามารถพิสูจน์ได้ว่ามีประโยชน์


0

คุณควรดูการสร้างดัชนีเพิ่มเติม ฉันคิดว่าโดยทั่วไปแล้วคนส่วนใหญ่ต่ำกว่าดัชนีฐานข้อมูลของพวกเขา

นี่ยังเป็นรหัสอากาศฉันยังไม่ได้ทดสอบอย่างสมบูรณ์ แต่ควรให้คุณไปในทิศทางที่ถูกต้อง

http://accessadp.com/2011/08/22/missing-indexes-great-script-for-determining-roi/

Select ‘create index IX_’ +
 sys.objects.name +
 isnull(replace(‘_’ + equality_columns, ‘,’, ‘_’), ”) +
 isnull(replace(‘_’ + inequality_columns, ‘,’, ‘_’), ”) + ‘ on ‘ +
 sys.objects.name +
 ‘(‘ +
 coalesce(equality_columns + ‘,’ + inequality_columns, equality_columns , inequality_columns ) +
 ‘) ‘ +
 isnull(‘ include (‘ + included_columns + ‘)’, ”)
 as CreateIndexSql,
 (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) AS Score,
 sys.schemas.schema_id,
 sys.schemas.name AS schema_name,
 sys.objects.object_id,
 sys.objects.name AS object_name,
 sys.objects.type,
 partitions.Rows, partitions.SizeMB,
 sys.dm_db_missing_index_details.equality_columns,
 sys.dm_db_missing_index_details.inequality_columns,
 sys.dm_db_missing_index_details.included_columns,
 sys.dm_db_missing_index_group_stats.unique_compiles,
 sys.dm_db_missing_index_group_stats.user_seeks, sys.dm_db_missing_index_group_stats.user_scans,
 sys.dm_db_missing_index_group_stats.avg_total_user_cost, sys.dm_db_missing_index_group_stats.avg_user_impact,
 sys.dm_db_missing_index_group_stats.last_user_seek, sys.dm_db_missing_index_group_stats.last_user_scan,
 sys.dm_db_missing_index_group_stats.system_seeks, sys.dm_db_missing_index_group_stats.system_scans,
 sys.dm_db_missing_index_group_stats.avg_total_system_cost, sys.dm_db_missing_index_group_stats.avg_system_impact,
 sys.dm_db_missing_index_group_stats.last_system_seek, sys.dm_db_missing_index_group_stats.last_system_scan
 FROM
 sys.objects
 JOIN (
 SELECT
 object_id, SUM(CASE WHEN index_id BETWEEN 0 AND 1 THEN row_count ELSE 0 END) AS Rows,
 CONVERT(numeric(19,3), CONVERT(numeric(19,3), SUM(in_row_reserved_page_count+lob_reserved_page_count+row_overflow_reserved_page_count))/CONVERT(numeric(19,3), 128)) AS SizeMB
 FROM sys.dm_db_partition_stats
 WHERE sys.dm_db_partition_stats.index_id BETWEEN 0 AND 1 –0=Heap; 1=Clustered; only 1 per table
 GROUP BY object_id
 ) AS partitions ON sys.objects.object_id=partitions.object_id
 JOIN sys.schemas ON sys.objects.schema_id=sys.schemas.schema_id
 JOIN sys.dm_db_missing_index_details ON sys.objects.object_id=sys.dm_db_missing_index_details.object_id
 JOIN sys.dm_db_missing_index_groups ON sys.dm_db_missing_index_details.index_handle=sys.dm_db_missing_index_groups.index_handle
 JOIN sys.dm_db_missing_index_group_stats ON sys.dm_db_missing_index_groups.index_group_handle=sys.dm_db_missing_index_group_stats.group_handle
 WHERE
 sys.dm_db_missing_index_details.database_id=DB_ID()
 AND (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) > 100
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.