محصولات

خدمات

تبادل اطلاعات

ارتباط با آتون

دات نت نیوک

مقالات
  عمومی ::  روشهايي براي بهبود سرعت دات نت نيوك
  کد: 14  تعداد بازدیدها: 3563 تعداد نظرها: 0  تعداد امتیازها:  0   (Article Rating)
روشهايي براي بهبود سرعت دات نت نيوك

قبل از اينكه به تشريح روشهاي ارتقاء سرعت لود صفحات در دات نت نيوك بپردازيم  شرح مختصري از كليات دات نت نيوك در زمينه لود صفحات را بررسي مي نمائيم.

همانطور كه مي دانيد پورتال اپن سورس دات نت نيوك بااستفاده از فناوري Asp.Net  مايكروسافت و با زبان vb.net  و درجاهايي هم c#  در محيط قدرتمند visual studio .net  پياده سازي شده است كه تمام  كد هاي سمت سرور آن بر اساس پلت فرم   .Net Framework مايكروسافت مي باشد.

اين پورتال قدرتمد از تكنولوژوي Ajax  خودAsp.Net  نيز بهره برده است.

همچنين دات نت نيوك شامل اسكريپت هاي فراواني مي باشد كه تماما JavaScript  بوده و در امكانات پورتال تاثير بسزايي گذاشته است. اين اسكريپت ها بصورت فايلهايي در داخل پورتال قرار دارند كه هسته دات نت نيوك بر اساس نياز آنها را فراخواني  مي نمايد.

ظاهر پورتال دات نت نيوك بر اساس css مي باشد . به عبارت ديگر در پورتال دات نت نيوك استايل صفحات و آبجكت هاي آن از داخل فايلهاي css فراخواني مي شود.

بررسي تعدادي از دلايل سنگين بودن پورتال دات نت نيوك

1-     ميزان زمانRender  كردن صفحات Asp.Net به  Html : دليل آن هم   فرايند هاي سنگيني است كه براي render كردن صفحات Aspx به HTML در سمت سرور صورت  مي گيرد . البته ASP.NET سنگيني خود را با امكاناتي مانند cash كردن تا حدودي كاهش داده است.

2-     حجم بالاي پردازش ها در  پورتال دات نت نيوك: امكانات بسيار زياد دات نت نيوك باعث شده است كه حجم كد هاي پورتال بالا باشند و پردازش هاي سنگيني در هنگام فراخواني و در حين كار با پورتال صورت گيرد . زماني كه كلاينت درخواستي را به سمت سرور ارسال مي نمايد سرور زمان نسبتا زيادي را براي پردازش تلف مي كند . اگر به سورس پروژه پورتال دات نت نيوك نگاهي بيندازيد متوجه سنگيني و حجم بسيار بالاي كد ها خواهيد شد (22 project درون يك solution). جالب است بدانيد كه اگر يكبار سورس پورتال دات نت نيوك را باز كرده و با زدن كليدf11  شروع كنيد به trace نمودن پورتال مطمئنا تا زماني كه trace شما به پايان برسد و اولين خروجي را مشاهده نمائيد خسته خواهيد شد و منصرف مي شويد!!(مي توانيد امتحان نمائيد). البته اين را هم در نظر بگيريد كه مطالب فوق مربوط به هسته دات نت نيوك بوده و بخش اعظم پردازش ها در دات نت نيوك مربوط به ماژول ها مي باشد (ماژول ها به صورت خارجي تهيه شده و درون پورتال نصب مي گردند)

3-     سنگين بودن JavaScript ها و CSS ها : در دات نت نيوك تعداد زيادي فايل js و css با حجم بالا وجود دارد كه در هنگام لود صفحات اين فايل ها بر حسب نياز بايد دانلود شده و بر روي كلاينت قرار گيرند كه اين خود باعث افزايش زمان لود صفحه مي شود.

4-    استاندار نبودن بعضي ماژولها: متاسفانه بعضي از شركت ها و افراد توليد كننده ماژول براي دات نت نيوك استاندارهاي لازم در كد نويسي را رعايت نمي كنند و فقط به اجراي درست ماژول دقت مي كنند از اين رو ماژول بايد از لحاظ performance نيز استاندارد باشد به طور مثال ماژولهايي براي forum  در دات نت نيوك وجود دارد كه active forum  علاوه بر كامل بودن يك ماژول سبك نيز مي باشد

5-     اينترنت پر سرعت ايران!:  اي كاش اين دليل وجود نداشت ولي متاسفانه اينترنت ايران متناسب با اين پورتال نيست و در ايران اين پورتال بهتر است در بستر اينترانت استفاده شود تا اينترنت .

مطمئنا دلايل ديگري بر سنگين بودن دات نت نيوك وجود دارد كه در اينجا بررسي نشده است

حال به تشريح روشهايي براي بهبود سرعت دات نت نيوك مي پردازيم

1-     انتخاب يك سرور مناسب براي ميزباني پورتال : ازآنجا كه پورتال دات نت نيوك پردازش هاي سنگيني در سمت سرور دارد لازم است در انتخاب سرور دقت فراوني داشته باشيد به طور مثال سرورهاي اختصاصي و از جمله Dedicated Server بهترين انتخاب براي ميزباني وب مي باشد . به نظر من مهمترين گزينه در سرعت مطلوب پورتال انتخاب سرور مناسب براي پورتال مي باشد 

2-     استفاده از سرويس keep alive پورتال:  منظور از سرويس keep alive مقيم بودن صفحات سايت در حافظه سرور مي باشد . هنگامي كه يك صفحه از يك سايت توسط كاربري در اينترنت درخواست مي شود سايت مربوطه در حافظه سرور قرار مي گيرد و اگر دوباره آن سايت توسط كاربري در اينترنت درخواست شود سرور به جاي اينكه دوباره اطلاعات را در حافظه بارگذاري نمايد  اطلاعات سايت را از حافظه خود فراخواني مي كند پس نتيجه گيري مي كنيم كه از فراخواني دوم به بعد سرعت بهتري را نسبت به اولين فراخواني داشته باشيم  . اگر به مدت چند دقيقه هيچ درخواستي براي آن سايت به سرور فرستاده نشود آن سايت از حافظه سرور خارج خواهد شد و درخواست مجدد سايت مستلزم صرف همان زمان اوليه مي باشد . شما به راحتي مي توانيد برنامه اي بنويسيد كه طي زمان مشخصي (مثلا هر 3 دقيقه) پورتال را از اينترنت صدا بزند و اين كار باعث مي شود تا پورتال شما از حافظه سرور خارج نشود . البته اين را هم در نظر بگيريد كه اگر تمام سايتهاي آن سرور چنين سرويسي را فراخواني كنند چه بر سر آن پردازنده خواهد آمد!!؟.

3-    كاهش تعداد درخواستها و فشرده كردن js ها: پورتال دات نت نيوك شامل اسكريپت هاي زيادي در قالب فايلهايي با پسوند js  مي باشد كه اين فايلها بر حسب نياز فراخواني مي شوند .  مهم ترين فايلهاي جاواسكريپت دات نت نيوك در شاخه js  پورتال قرار دارند. به تصوير زير دقت كنيد:

 

تصوير فوق ليست فايلهاي جاواسكريپتي كه در يك فراخواني از پورتال دات نت نيوك صورت گرفته را نشان مي دهد در اين فراخواني كلا 9 درخواست جاوااسكريپت صورت گرفته كه 6 مورد آن مربوط به خود دات نت نيوك مي باشد و 3 مورد آن هم مربوط به فعال سازي Ajax  است كه توسط asp.net  صورت گرفته. نكات قابل توجهي در اين بخش وجود دارد كه به آن مي پردازيم  . ابتدا اينكه 20 فايل  جاواسكريپت در شاخه js  وجود دارد كه بر اساس نياز فراخواني مي شود مثلا در اين صفحه  6 مورد از اين فايلها فراخواني شده است (البته ناگفته نماند هنگامي كه يك فايل js يكبار فراخواني (دانلود ) شود براي درخواست هاي بعدي ديگر دانلود نمي شود ) خوب حالا فرض كنيد صقحه اي مثلا 10 فايل js از js هاي دات نت نيوك را نياز داشته باشد پس 10 درخواست براي اين فايلها از سمت كلاينت به سمت سرور فرستاده مي شود خوب واضح است كه هر درخواست از سمت كلاينت به سرور زماني را تلف خواهد كرد و نكته بعدي اينكه هر يك از فايلها با حجم واقعي خود دانلود مي شوند و اگر فرض كنيم اين 10 فايل جمعا 100 كيلوبايت باشند بايد منتظر بود تا 100 كيلوبايت فايل دانلود شود.

آقاي عمر الزبير روش بسيار جالبي را در اين زمينه پيشنهاد كرده اند كه آن را بررسي مي نمائيم.اگر تمام فايلهاي جاواسكريپتي كه در شاخه js پورتال قرار دارند را با يك درخواست فراخواني نمائيم باعث مي شود تا تعداد درخواست ها بسيار كاهش يابد و اين يعني صرفه جويي در 20 درخواست. و همچنين اگر اين فراخواني يكجا را فشرده نمائيم فايلهاي js خيلي سريعتر دانلود مي شوند.

همان صفحه قبلي را در نظر بگيريد اين بار با اعمال اين روش:


      همانطور كه مي بينيد تعداد فايلها از 6 مورد به يك مورد كاهش يافته و همچنين در حالت قبل براي 6 مورد فايل اسكريپت دات نت نيوك + 3 مورد فايل آژاكس 214 كيلوبايت فايل دانلود شد و حال آنكه در اين حالت براي 20 فايل اسكريپت دات نت نيوك + 3 مورد فايل آژاكس 141 كيلوبايت فايل دانلود شده است (البته با اين تفاوت  كه در حالت دوم ديگر هيچ فايلي از 20 فايل اسكريپت دات نت نيوك دانلود نمي شود زيرا تمام فايلها بصورت bach دانلود شده است و اين به مراتب بهتر از حالت اول مي باشد). براي اطلاعات بيشتر در اين زمينه از مقاله زير استفاده نمائيد . http://www.codeproject.com/KB/aspnet/HttpCombine.aspx

4-    كاهش تعداد درخواستها و فشرده كردن css  ها:  تمام مطالب مطرح شده در بخش قبلي براي css ها نيز صدق مي كند به عبارت ديگر هنگامي كه پورتال دات نت نيوك لود مي شود چندين فايل css مربوط به خود دات نت نيوك فراخواني مي شوند كه تعداد درخواست ها ي مربوط به اين css ها و همچنين حجم آنها در سرعت لود پورتال تاثر گذارند .تصاوير زير هر دو حالت را نمايش مي دهند

حالت فراخواني عادي:


حالت فراخواني يكجا وفشرده:


در حالت دوم علاوه بر اينكه تعداد درخواست ها از 5 درخواست به 1 درخواست كاهش يافته حجم آنها نيز از 31 كيلوبايت به 5 كيلو بايت كاهش يافته است .

5-    فراخواني اسكريپت هاي صفحه بعد از لود محتواي صفحه: هنگامي كه سايتي از طريق يك مرورگر درخواست مي شود مرورگر درخواست را به سمت سرور ارسال مي كند و در سمت سرور صفحه صدا زده شده سايت پس از render شدن به صورت html  در اختيار مرورگر قرار مي گيريد و مرورگر شروع به پردازش html و نمايش محتواي آن صفحه مي نمايد .پردازش صفحه توسط مرورگر به اين طريق است كه متن html از بالا به پائين پردازش مي شود و در حين پردازش اگر اسكريپتي در متن وجود داشته باشد و آن اسكريپت به صورت فراخوني فايل باشد فايل مربوطه دانلود مي شود مثال:

در چنين شرايطي مرورگر درخواست دانلود فايل مربوطه را به سمت سرور ارسال مي كند و منتظر مي شود تا فايل مربوطه دانلود شود(البته اين حالت در مرورگرهاي مختلف يكسان نيست) . اين در حاليست كه اسكريپت ها حتما نياز نيست در حين پردازش فراخواني شوند و مي توان فراخواني اسكريپت ها را در انتهاي لود صفحه قرار داد در نتيجه مي توان فراخواني اسكريپت ها و همچنين اجراي آنها را بعد از نمايش محتواي صفحه گذاشت اين امر باعث مي شود تا محتواي صفحه بسيار سريعتر به كاربر نمايش داده شود و بلافاصله پس از نمايش محتواي صفحه مرورگر اقدام به فراخواني و اجراي اسكريپت ها  نمايد .اگر مايليد اين روش را در دات نت نيوك پياده نمائيد بايد پس از توليد html صفحه درخواست شده توسط سرور و قبل از اينكه مرورگر html را دريافت نمايد متن html  را پردازش نمائيد و تمام اسكريپت ها را در انتهاي html قرارداده و html جديد را براي مرورگر ارسال نمائيد. بهبود سرعت سايت در روش فوق براي مروگر Mozilla Firefox به خوبي قابل مشاهده است . براي اطلاعات بيشتر در مورد اين روش و نحوه پياده سازي آن از مقاله زير استفاده نمائيد . http://www.codeproject.com/KB/aspnet/fastload.aspx.

6-     فشرده سازي ViewState هاي صفحه :  view state به منظور حفظ اطلاعات میان سرور و کلاینت به کار میرود. در حالتی که ما به view state نیازی نداشته باشیم آن را غیر فعال می کنیم ولی در اکثر اوقات این طور نیست. در صورت استفاده ازview state ممکن است حجم صفحه به صورت چشمگیری افزایش پیدا کند. در دات نت نيوك نيز از viewstate ها زياد استفاده شده كه شما مي توانيد با به كار بردن چند خط كد viewstate هاي صفحات را فشرده نمائيد.

كد هاي زير نحوه فشرده سازي viewstate  ها را مشخص مي نمايد:

              Public Function Compress(ByVal data As Byte()) As Byte()

            Dim output As New MemoryStream()

            Dim gzip As New GZipStream(output, CompressionMode.Compress, True)

            gzip.Write(data, 0, data.Length)

            gzip.Close()

            Return output.ToArray()

        End Function

        Public Function Decompress(ByVal data As Byte()) As Byte()

            Dim input As New MemoryStream()

            input.Write(data, 0, data.Length)

            input.Position = 0

            Dim gzip As New GZipStream(input, CompressionMode.Decompress, True)

            Dim output As New MemoryStream()

            Dim buff As Byte() = New Byte(63) {}

            Dim read As Integer = -1

            read = gzip.Read(buff, 0, buff.Length)

            While read > 0

                output.Write(buff, 0, read)

                read = gzip.Read(buff, 0, buff.Length)

            End While

            gzip.Close()

            Return output.ToArray()

        End Function

        Protected Overloads Overrides Function LoadPageStateFromPersistenceMedium() As Object

            Dim alteredViewState As String

            Dim bytes As Byte()

            Dim rawViewState As Object

            Dim fomatter As New LosFormatter()

            Me.PageStatePersister.Load()

            alteredViewState = Me.PageStatePersister.ViewState.ToString()

            bytes = Convert.FromBase64String(alteredViewState)

            bytes = Decompress(bytes)

            rawViewState = fomatter.Deserialize(Convert.ToBase64String(bytes))

            Return New Pair(Me.PageStatePersister.ControlState, rawViewState)

        End Function

        Protected Overloads Overrides Sub SavePageStateToPersistenceMedium(ByVal viewStatein As Object)

            Dim fomatter As New LosFormatter()

            Dim writer As New StringWriter()

            Dim rawPair As Pair

            Dim rawViewState As Object

            Dim rawViewStateStr As String

            Dim alteredViewState As String

            Dim bytes As Byte()

            If Not (CType(viewStatein, Pair) Is Nothing) Then

                rawPair = viewStatein

                Me.PageStatePersister.ControlState = rawPair.First

                rawViewState = rawPair.Second

            Else

                rawViewState = viewStatein

            End If

            fomatter.Serialize(writer, rawViewState)

            rawViewStateStr = writer.ToString()

            bytes = Convert.FromBase64String(rawViewStateStr)

            bytes = Compress(bytes)

            alteredViewState = Convert.ToBase64String(bytes)

            Me.PageStatePersister.ViewState = alteredViewState

            Me.PageStatePersister.Save()

  End Sub


7-     غير فعال كردن AJAX پورتال: با توجه به اينكه تكنولوژي ajax يكي از بارزترين امتيازات يك سايت محسوب مي شود ولي 2 نكته كليدي از اين قابليت در دات نت نيوك وجود دارد.

1-     زماني كه پورتال براي اولين بار لود مي شود 74 كيلوبايت اسكريپت مربوط به ajax لود مي شود(با فشرده سازي) كه با غير فعال كردن اين قابليت 74 كيلوبايت صرفه جويي صورت مي گيرد.


        2 -     زماني كه قابليت ajax پورتال فعال باشد و درخواستي از مرورگر توسط اين تكنولوژي به سمت سرور ارسال شود مروگر پس از مدت نسبتا كوتاهي اگر پاسخي    دريافت نكند به انتظار خاتمه خواهد داد و فرايند با شكست مواجه خواهد شد و اين حالت با توجه به سرعت اينترنت در ايران بارها اتفاق خواهد افتاد.

8-    استفاده از اسكين هاي سبك: استفاده از اسكين هاي سبك و استاندارد يكي از بهترين راههاي موثر در بهبود لود صفحات مي باشد . يكي از نكات كليدي در طراحي اسكين استفاده از تگ هاي بهينه html است به طور مثال بسياري از طراحان ترجيح مي دهند از تگ table (به دليل راحتي) در ترسيم چاروچوب كلي صفحه استفاده نمايند در حالي كه مي توان از تگ div  به جاي table استفاده نمود و چارچوب كلي صفحه را با اين تگ ترسيم كرد (البته با كمي زحمت و دقت بيشتر) و علت آن هم اين است كه مرورگر بلافاصله پس از باز شدن تگ div محتواي آن را نمايش مي دهد ولي در مورد  تگ table  چنين نيست (مي توانيد امتحان نمائيد)

9- حذف لاگ هاي بانك اطلاعاتي پورتال : با توجه به اينكه پورتال دات نت نيوك داراي تراكنش هاي زيادي در سمت بانك اطلاعاتي  مي باشد حجم بانك اطلاعاتي پورتال به مرور زمان افزايش مي يابد و اين مسئله نيز در سرعت پورتال تاثير گذار است  . لاگ ها در پورتال دات نت نيوك براي بانك اطلاعاتي SQL SERVER به 2 دسته تقسيم مي شوند .

1- لاگ هايي كه مربوط به عمليات انجام شده در پورتال مي باشد و خود دات نت نيوك اين عمليات را لاگ گيري مي نمايد . اين لاگ ها در جدوالي مشخص در ديتابيس پورتال ذخيره مي گردند . استفاده از لاگ ها مي تواند لازم و ضروري باشد زيرا نوعي گزارشگيري در پورتال محسوب مي شود و به عبارت ديگر گزارش عمليات كاربران را نشان مي دهد ولي از آنجا كه هر عمل انجام گرفته در پورتال لاگ گرفته مي شود و اين عمل يك يا چند ركورد را به ديتابيس اضافه مي نمايد بهتر است هر از چندگاهي اين لاگ ها حذف شوند براي اين كار دات نت نيوك سرويسي در قسمت زمانبندي قرار داده است كه مي توانيد آن را فعال نمائيد و بازه زماني اين كار را مشخص كنيد و يا خودتان دستي از جدول لاگ هاي ديتابيس داده ها را حذف نمائيد.

 2-  لاگ هايي كه مربوط به تراكنش هاي صورت گرفته در ديتابيس مي باشد . اين لاگ ها در فايل LOG مربوط به ديتابيس ذخيره مي شوند و خود SQL SERVER از تراكنش هاي انجام شده لاگ گيري مي نمايد به عبارت ديگر هر عملي كه در سمت ديتابيس صورت گيرد حتي اگر يك اتصال و سپس قطع اتصال باشد SQL SERVER آن را لاگ گيري مي نمايد پس واضح است كه حجم فايل LOG به مرور زمان افزايش چشم گيري داشته باشد براي حذف داده هاي فايل LOG بايد از امكان SHRINK  خود SQL SERVER استفاده نمائيد. 


 
   امتياز بندي



  نظرات

ارسال نظر:
فقط کاربران عضو می توانند توضیحات در پست قرار دهند.
 
تمامی حقوق مادی و معنوی این اثر متعلق به جام زندگی می باشد  |  حريم كاربران    شرایط استفاده