← يتطلب: إدارة النظام الحوكمة والتشغيل خبير ⏱ 6 ساعات الدورة 28

تحسين الأداء

Performance Tuning

🎯 أهداف التعلم

1فهم مصادر مشاكل الأداء
2تعلم تحليل الأداء (Profiling)
3فهم تحسين الاستعلامات SQL
4تعلم تحسين الذاكرة والمعالج
5فهم موازنة الحمولة (Load Balancing)
01

تحليل الأداء

تحليل الأداء هو الخطوة الأولى لتحسينه.

// Profiling
ClassMethod ProfileApplication()
{
    // بدء Profiling
    Do $SYSTEM.OBJ.ProfileStart()
    
    // تشغيل الكود المراد تحليله
    Do ..RunApplication()
    
    // إيقاف Profiling
    Do $SYSTEM.OBJ.ProfileStop()
    
    // عرض النتائج
    Do $SYSTEM.OBJ.ShowProfile()
}

// مراقبة الاستعلامات البطيئة
ClassMethod MonitorSlowQueries()
{
    // تفعيل SQL Statistics
    Do $SYSTEM.SQL.SetSQLStats(1)
    
    // عرض الاستعلامات البطيئة
    Set rs = ##class(%SQL.Manager.Catalog).GetSlowQueries()
    While rs.%Next() {
        Write "الاستعلام: ", rs.%Get("Query"), !
        Write "الوقت: ", rs.%Get("Duration"), " ms", !
        Write "الاستدعاءات: ", rs.%Get("Executions"), !
    }
}

// تحليل الذاكرة
ClassMethod AnalyzeMemory()
{
    Do ##class(%SYSTEM.Process).GetMemoryInfo(.mem)
    Write "الذاكرة الكلية: ", mem("Total"), " MB", !
    Write "المستخدمة: ", mem("Used"), " MB", !
    Write "المتاحة: ", mem("Free"), " MB", !
    Write "نسبة الاستخدام: ", (mem("Used")/mem("Total"))*100, "%", !
}
02

تحسين الاستعلامات SQL

تحسين SQL يمكن أن يحسّن الأداء بشكل كبير.

-- تحليل خطة التنفيذ
EXPLAIN SELECT * FROM Hospital.Patient WHERE MRN = 'MRN-001'

-- استخدام الفهارس
-- سيء: لا يستخدم الفهرس
SELECT * FROM Hospital.Patient WHERE UPPER(Name) = 'أحمد'

-- جيد: يستخدم الفهرس
SELECT * FROM Hospital.Patient WHERE Name = 'أحمد'

-- استخدام COVERING INDEX
CREATE INDEX idx_cover ON Hospital.Patient (MRN) INCLUDE (Name, Age)

-- تجنب SELECT *
-- سيء
SELECT * FROM Hospital.Patient WHERE IsActive = 1

-- جيد
SELECT ID, Name, Age FROM Hospital.Patient WHERE IsActive = 1

-- استخدام EXISTS بدلاً من IN
-- سيء
SELECT * FROM Hospital.Patient WHERE Department IN (SELECT Name FROM Hospital.Department)

-- جيد
SELECT * FROM Hospital.Patient p WHERE EXISTS (SELECT 1 FROM Hospital.Department d WHERE d.Name = p.Department)
03

تحسين الذاكرة والمعالج

تحسين استخدام الموارد.

// تحسين الذاكرة
ClassMethod OptimizeMemory()
{
    // ضبط حجم Buffers
    Do ##class(Config.config).Set("gmheap", 256000)
    Do ##class(Config.config).Set("routines", 256)
    
    // تنظيف الذاكرة المؤقتة
    Do $SYSTEM.SQL.ClearSQLCache()
    Do ##class(%DeepSee.Utils).%ClearCache()
}

// موازنة الحمولة
ClassMethod LoadBalance()
{
    // توزيع الطلبات عبر عدة خوادم
    Set servers = $LISTBUILD("server1:52773", "server2:52773", "server3:52773")
    Set current = $INCREMENT(^LoadBalanceCounter) # $LISTLENGTH(servers) + 1
    Set server = $LIST(servers, current)
    Quit server
}

// Connection Pooling
ClassMethod OptimizeConnections()
{
    // إعداد Connection Pool
    Set pool = ##class(%SQL.ConnectionPool).%New()
    Set pool.MaxConnections = 50
    Set pool.MinConnections = 10
    Set pool.Timeout = 30
    Do pool.%Save()
}
04

مراقبة الأداء المستمرة

مراقبة مستمرة لضمان الأداء المثالي.

// نظام مراقبة الأداء
ClassMethod PerformanceMonitor()
{
    // جمع المقاييس
    Set metrics = {}
    Set metrics.cpu = $SYSTEM.CPU.GetUsage()
    Set metrics.memory = ..GetMemoryUsage()
    Set metrics.queries = ..GetQueryStats()
    Set metrics.connections = ..GetConnectionCount()
    
    // حفظ المقاييس
    Set ^PerfMetrics($HOROLOG, $PIECE($HOROLOG, ",", 2)) = metrics.%ToJSON()
    
    // التحقق من العتبات
    If metrics.cpu > 90 {
        Do ..SendAlert("CPU usage is high: " _ metrics.cpu _ "%")
    }
    
    If metrics.memory > 85 {
        Do ..SendAlert("Memory usage is high: " _ metrics.memory _ "%")
    }
}

// تقرير الأداء
ClassMethod GenerateReport()
{
    Write "تقرير الأداء الشهري", !
    Write "===================", !
    
    Set avgCpu = ..GetAverageMetric("cpu", 30)
    Set avgMem = ..GetAverageMetric("memory", 30)
    Set totalQueries = ..GetTotalQueries(30)
    
    Write "متوسط CPU: ", avgCpu, "%", !
    Write "متوسط الذاكرة: ", avgMem, "%", !
    Write "إجمالي الاستعلامات: ", totalQueries, !
}

📝 اختبار التحقق

1 ما هو Profiling؟
A نوع من التشفير
B تحليل أداء الكود لتحديد الاختناقات
C نظام النسخ الاحتياطي
D أداة مراقبة
💡 الشرح

Profiling يحلل أداء الكود لتحديد المناطق التي تستهلك أكثر الموارد.

2 لماذا نستخدم EXISTS بدلاً من IN؟
A لأن EXISTS أقصر
B لأن EXISTS أداء أفضل في البيانات الكبيرة
C لأن IN لا يدعم الفهارس
D لأن EXISTS أكثر أماناً
💡 الشرح

EXISTS أداء أفضل في البيانات الكبيرة لأنه يتوقف بمجرد العثور على تطابق.

ما هو أسرع طريقة لتحسين استعلام SQL بطيء؟
💡 الشرح

إضافة فهرس مناسب هي أسرع وأكثر طريقة فعالة لتحسين الاستعلامات البطيئة

💡 النقاط الرئيسية

  • تحليل الأداء هو الخطوة الأولى لتحسينه
  • تحسين SQL يمكن أن يحسّن الأداء بشكل كبير
  • موازنة الحمولة توزع الطلبات عبر عدة خوادم
  • مراقبة مستمرة تضمن الأداء المثالي
  • Connection Pooling يحسن استخدام الموارد