"

作為一個程序員,性能優化是常有的事情,不管是桌面應用還是web應用,不管是前端還是後端,不管是單點應用還是分佈式系統。本文從以下幾個方面來思考這個問題:性能優化的一般性原則,性能優化的層次,性能優化的通用方法。

"

作為一個程序員,性能優化是常有的事情,不管是桌面應用還是web應用,不管是前端還是後端,不管是單點應用還是分佈式系統。本文從以下幾個方面來思考這個問題:性能優化的一般性原則,性能優化的層次,性能優化的通用方法。

服務器性能優化的8種常用方法

1.使用內存數據庫

內存數據庫,其實就是將數據放在內存中直接操作的數據庫。相對於磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大地提高應用的性能。內存數據庫拋棄了磁盤數據管理的傳統方式,基於全部數據都在內存中重新設計了體系結構,並且在數據緩存、快速算法、並行操作方面也進行了相應的改進,所以數據處理速度比傳統數據庫的數據處理速度要快很多。

但是安全性的問題可以說是內存數據庫最大的硬傷。因為內存本身有掉電丟失的天然缺陷,因此我們在使用內存數據庫的時候,通常需要,提前對內存上的數據採取一些保護機制,比如備份,記錄日誌,熱備或集群,與磁盤數據庫同步等方式。對於一些重要性不高但是又想要快速響應用戶請求的部分數據可以考慮內存數據庫來存儲,同時可以定期把數據固化到磁盤。


2.使用RDD

在大數據雲計算相關領域的一些應用中,Spark可以用來加快數據處理速度。Spark的核心是RDD,RDD最早來源與Berkeley實驗室的一篇論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。現有的數據流系統對兩種應用的處理並不高效:一是迭代式算法,這在圖應用和機器學習領域很常見;二是交互式數據挖掘工具。這兩種情況下,將數據保存在內存中能夠極大地提高性能。

"

作為一個程序員,性能優化是常有的事情,不管是桌面應用還是web應用,不管是前端還是後端,不管是單點應用還是分佈式系統。本文從以下幾個方面來思考這個問題:性能優化的一般性原則,性能優化的層次,性能優化的通用方法。

服務器性能優化的8種常用方法

1.使用內存數據庫

內存數據庫,其實就是將數據放在內存中直接操作的數據庫。相對於磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大地提高應用的性能。內存數據庫拋棄了磁盤數據管理的傳統方式,基於全部數據都在內存中重新設計了體系結構,並且在數據緩存、快速算法、並行操作方面也進行了相應的改進,所以數據處理速度比傳統數據庫的數據處理速度要快很多。

但是安全性的問題可以說是內存數據庫最大的硬傷。因為內存本身有掉電丟失的天然缺陷,因此我們在使用內存數據庫的時候,通常需要,提前對內存上的數據採取一些保護機制,比如備份,記錄日誌,熱備或集群,與磁盤數據庫同步等方式。對於一些重要性不高但是又想要快速響應用戶請求的部分數據可以考慮內存數據庫來存儲,同時可以定期把數據固化到磁盤。


2.使用RDD

在大數據雲計算相關領域的一些應用中,Spark可以用來加快數據處理速度。Spark的核心是RDD,RDD最早來源與Berkeley實驗室的一篇論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。現有的數據流系統對兩種應用的處理並不高效:一是迭代式算法,這在圖應用和機器學習領域很常見;二是交互式數據挖掘工具。這兩種情況下,將數據保存在內存中能夠極大地提高性能。

服務器性能優化的8種常用方法

3.增加緩存

很多web應用是有大量的靜態內容,這些靜態內容主要都是一些小文件,並且會被頻繁的讀,採用Apache以及nginx作為web服務器。在web訪問量不大的時候,這兩個http服務器可以說是非常的迅速和高效,如果負載量很大的時候,我們可以採用在前端搭建cache服務器,將服務器中的靜態資源文件緩存到操作系統內存中直接進行讀操作,因為直接從內存讀取數據的速度要遠大於從硬盤讀取。這個其實也是增加內存的成本來降低訪問磁盤帶來的時間消耗。

4.使用SSD

除了對內存方面的優化,還可以對磁盤這邊進行優化。跟傳統機械硬盤相比,固態硬盤具有快速讀寫、質量輕、能耗低以及體積小等特點。但是ssd的價格相比傳統機械硬盤要貴,有條件的可以使用ssd來代替機械硬盤。

"

作為一個程序員,性能優化是常有的事情,不管是桌面應用還是web應用,不管是前端還是後端,不管是單點應用還是分佈式系統。本文從以下幾個方面來思考這個問題:性能優化的一般性原則,性能優化的層次,性能優化的通用方法。

服務器性能優化的8種常用方法

1.使用內存數據庫

內存數據庫,其實就是將數據放在內存中直接操作的數據庫。相對於磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大地提高應用的性能。內存數據庫拋棄了磁盤數據管理的傳統方式,基於全部數據都在內存中重新設計了體系結構,並且在數據緩存、快速算法、並行操作方面也進行了相應的改進,所以數據處理速度比傳統數據庫的數據處理速度要快很多。

但是安全性的問題可以說是內存數據庫最大的硬傷。因為內存本身有掉電丟失的天然缺陷,因此我們在使用內存數據庫的時候,通常需要,提前對內存上的數據採取一些保護機制,比如備份,記錄日誌,熱備或集群,與磁盤數據庫同步等方式。對於一些重要性不高但是又想要快速響應用戶請求的部分數據可以考慮內存數據庫來存儲,同時可以定期把數據固化到磁盤。


2.使用RDD

在大數據雲計算相關領域的一些應用中,Spark可以用來加快數據處理速度。Spark的核心是RDD,RDD最早來源與Berkeley實驗室的一篇論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。現有的數據流系統對兩種應用的處理並不高效:一是迭代式算法,這在圖應用和機器學習領域很常見;二是交互式數據挖掘工具。這兩種情況下,將數據保存在內存中能夠極大地提高性能。

服務器性能優化的8種常用方法

3.增加緩存

很多web應用是有大量的靜態內容,這些靜態內容主要都是一些小文件,並且會被頻繁的讀,採用Apache以及nginx作為web服務器。在web訪問量不大的時候,這兩個http服務器可以說是非常的迅速和高效,如果負載量很大的時候,我們可以採用在前端搭建cache服務器,將服務器中的靜態資源文件緩存到操作系統內存中直接進行讀操作,因為直接從內存讀取數據的速度要遠大於從硬盤讀取。這個其實也是增加內存的成本來降低訪問磁盤帶來的時間消耗。

4.使用SSD

除了對內存方面的優化,還可以對磁盤這邊進行優化。跟傳統機械硬盤相比,固態硬盤具有快速讀寫、質量輕、能耗低以及體積小等特點。但是ssd的價格相比傳統機械硬盤要貴,有條件的可以使用ssd來代替機械硬盤。

服務器性能優化的8種常用方法

5.優化數據庫

大部分的服務器請求最終都是要落到數據庫中,隨著數據量的增加,數據庫的訪問速度也會越來越慢。想要提升請求處理速度,必須要對原來的單表進行動刀了。目前主流的Linux服務器使用的數據庫要屬mysql了,如果我們使用mysql存儲的數據單個表的記錄達到千萬級別的話,查詢速度會很慢的。根據業務上合適的規則對數據庫進行分區分表,可以有效提高數據庫的訪問速度,提升服務器的整體性能。另外對於業務上查詢請求,在建表的時候可以根據相關需求設置索引等,以提高查詢速度。

6.選擇合適的IO模型

IO模型又分為:

(1).阻塞I/O模型:數據沒到達之前,I/O一直阻塞,如果數據到達,則會返回。典型的是recvfrom,一般的默認都是阻塞的。

(2).非阻塞的I/O模型:和阻塞相反,只要不能得到結果的時候,I/O立刻返回。不會阻塞當前線程。

IO複用模型:也就是自己要學習的部分。多路複用的意思是,將多路信號合併到一路上進行處理,類似多個管道彙集到一個管道,與之相反的是多路分解。

IO複用模型主要是select,poll,epoll;對一個IO端口,兩次調用,兩次返回,比阻塞IO並沒有什麼優越性;關鍵是能實現同時對多個IO端口進行監聽;函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。

信號驅動:首先開啟套接口信號驅動I/O功能,並通過系統調用sigaction安裝一個信號處理函數。當數據報準備好被讀時,就為該進程生成一個SIGIO信號。隨即可以在信號處理程序中調用recvfrom來讀數據報,井通知主循環數據已準備好被處理中。也可以通知主循環,讓它來讀數據報。

異步的IO模型:告知內核啟動某個操作,並讓內核在整個操作完成後(包括將數據從內核拷貝到用戶自己的緩衝區)通知我們。這裡並不是說一定要用某個模型,epoll也並不是在所有情況下都比select性能要好的,在選擇的時候還是要結合業務需求來。

"

作為一個程序員,性能優化是常有的事情,不管是桌面應用還是web應用,不管是前端還是後端,不管是單點應用還是分佈式系統。本文從以下幾個方面來思考這個問題:性能優化的一般性原則,性能優化的層次,性能優化的通用方法。

服務器性能優化的8種常用方法

1.使用內存數據庫

內存數據庫,其實就是將數據放在內存中直接操作的數據庫。相對於磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大地提高應用的性能。內存數據庫拋棄了磁盤數據管理的傳統方式,基於全部數據都在內存中重新設計了體系結構,並且在數據緩存、快速算法、並行操作方面也進行了相應的改進,所以數據處理速度比傳統數據庫的數據處理速度要快很多。

但是安全性的問題可以說是內存數據庫最大的硬傷。因為內存本身有掉電丟失的天然缺陷,因此我們在使用內存數據庫的時候,通常需要,提前對內存上的數據採取一些保護機制,比如備份,記錄日誌,熱備或集群,與磁盤數據庫同步等方式。對於一些重要性不高但是又想要快速響應用戶請求的部分數據可以考慮內存數據庫來存儲,同時可以定期把數據固化到磁盤。


2.使用RDD

在大數據雲計算相關領域的一些應用中,Spark可以用來加快數據處理速度。Spark的核心是RDD,RDD最早來源與Berkeley實驗室的一篇論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。現有的數據流系統對兩種應用的處理並不高效:一是迭代式算法,這在圖應用和機器學習領域很常見;二是交互式數據挖掘工具。這兩種情況下,將數據保存在內存中能夠極大地提高性能。

服務器性能優化的8種常用方法

3.增加緩存

很多web應用是有大量的靜態內容,這些靜態內容主要都是一些小文件,並且會被頻繁的讀,採用Apache以及nginx作為web服務器。在web訪問量不大的時候,這兩個http服務器可以說是非常的迅速和高效,如果負載量很大的時候,我們可以採用在前端搭建cache服務器,將服務器中的靜態資源文件緩存到操作系統內存中直接進行讀操作,因為直接從內存讀取數據的速度要遠大於從硬盤讀取。這個其實也是增加內存的成本來降低訪問磁盤帶來的時間消耗。

4.使用SSD

除了對內存方面的優化,還可以對磁盤這邊進行優化。跟傳統機械硬盤相比,固態硬盤具有快速讀寫、質量輕、能耗低以及體積小等特點。但是ssd的價格相比傳統機械硬盤要貴,有條件的可以使用ssd來代替機械硬盤。

服務器性能優化的8種常用方法

5.優化數據庫

大部分的服務器請求最終都是要落到數據庫中,隨著數據量的增加,數據庫的訪問速度也會越來越慢。想要提升請求處理速度,必須要對原來的單表進行動刀了。目前主流的Linux服務器使用的數據庫要屬mysql了,如果我們使用mysql存儲的數據單個表的記錄達到千萬級別的話,查詢速度會很慢的。根據業務上合適的規則對數據庫進行分區分表,可以有效提高數據庫的訪問速度,提升服務器的整體性能。另外對於業務上查詢請求,在建表的時候可以根據相關需求設置索引等,以提高查詢速度。

6.選擇合適的IO模型

IO模型又分為:

(1).阻塞I/O模型:數據沒到達之前,I/O一直阻塞,如果數據到達,則會返回。典型的是recvfrom,一般的默認都是阻塞的。

(2).非阻塞的I/O模型:和阻塞相反,只要不能得到結果的時候,I/O立刻返回。不會阻塞當前線程。

IO複用模型:也就是自己要學習的部分。多路複用的意思是,將多路信號合併到一路上進行處理,類似多個管道彙集到一個管道,與之相反的是多路分解。

IO複用模型主要是select,poll,epoll;對一個IO端口,兩次調用,兩次返回,比阻塞IO並沒有什麼優越性;關鍵是能實現同時對多個IO端口進行監聽;函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。

信號驅動:首先開啟套接口信號驅動I/O功能,並通過系統調用sigaction安裝一個信號處理函數。當數據報準備好被讀時,就為該進程生成一個SIGIO信號。隨即可以在信號處理程序中調用recvfrom來讀數據報,井通知主循環數據已準備好被處理中。也可以通知主循環,讓它來讀數據報。

異步的IO模型:告知內核啟動某個操作,並讓內核在整個操作完成後(包括將數據從內核拷貝到用戶自己的緩衝區)通知我們。這裡並不是說一定要用某個模型,epoll也並不是在所有情況下都比select性能要好的,在選擇的時候還是要結合業務需求來。

服務器性能優化的8種常用方法

7.使用多核處理策略

現在運行服務器的主流機器配置都是多核CPU的,我們在設計服務器的時候可以利用多核心的特點,採用多進程或者多線程的框架。關於選擇多線程還是多進程可以根據實際的需求,結合各自的優缺點進行選擇。對於多線程的使用,特別是使用線程池的時候可以通過測試不同線程池服務器的性能來設置合適的線程池。

8.分佈式部署程序

當單機服務器已經找不到合適的優化點時,我們可以通過分佈式部署來提高服務器的響應能力。優秀的服務器開發都會為自己的服務器的擴容,容災提出一些解決方案。個人覺得服務器設計的時候簡單點比較好,這樣後期擴容的時候會很方便。

"

作為一個程序員,性能優化是常有的事情,不管是桌面應用還是web應用,不管是前端還是後端,不管是單點應用還是分佈式系統。本文從以下幾個方面來思考這個問題:性能優化的一般性原則,性能優化的層次,性能優化的通用方法。

服務器性能優化的8種常用方法

1.使用內存數據庫

內存數據庫,其實就是將數據放在內存中直接操作的數據庫。相對於磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大地提高應用的性能。內存數據庫拋棄了磁盤數據管理的傳統方式,基於全部數據都在內存中重新設計了體系結構,並且在數據緩存、快速算法、並行操作方面也進行了相應的改進,所以數據處理速度比傳統數據庫的數據處理速度要快很多。

但是安全性的問題可以說是內存數據庫最大的硬傷。因為內存本身有掉電丟失的天然缺陷,因此我們在使用內存數據庫的時候,通常需要,提前對內存上的數據採取一些保護機制,比如備份,記錄日誌,熱備或集群,與磁盤數據庫同步等方式。對於一些重要性不高但是又想要快速響應用戶請求的部分數據可以考慮內存數據庫來存儲,同時可以定期把數據固化到磁盤。


2.使用RDD

在大數據雲計算相關領域的一些應用中,Spark可以用來加快數據處理速度。Spark的核心是RDD,RDD最早來源與Berkeley實驗室的一篇論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。現有的數據流系統對兩種應用的處理並不高效:一是迭代式算法,這在圖應用和機器學習領域很常見;二是交互式數據挖掘工具。這兩種情況下,將數據保存在內存中能夠極大地提高性能。

服務器性能優化的8種常用方法

3.增加緩存

很多web應用是有大量的靜態內容,這些靜態內容主要都是一些小文件,並且會被頻繁的讀,採用Apache以及nginx作為web服務器。在web訪問量不大的時候,這兩個http服務器可以說是非常的迅速和高效,如果負載量很大的時候,我們可以採用在前端搭建cache服務器,將服務器中的靜態資源文件緩存到操作系統內存中直接進行讀操作,因為直接從內存讀取數據的速度要遠大於從硬盤讀取。這個其實也是增加內存的成本來降低訪問磁盤帶來的時間消耗。

4.使用SSD

除了對內存方面的優化,還可以對磁盤這邊進行優化。跟傳統機械硬盤相比,固態硬盤具有快速讀寫、質量輕、能耗低以及體積小等特點。但是ssd的價格相比傳統機械硬盤要貴,有條件的可以使用ssd來代替機械硬盤。

服務器性能優化的8種常用方法

5.優化數據庫

大部分的服務器請求最終都是要落到數據庫中,隨著數據量的增加,數據庫的訪問速度也會越來越慢。想要提升請求處理速度,必須要對原來的單表進行動刀了。目前主流的Linux服務器使用的數據庫要屬mysql了,如果我們使用mysql存儲的數據單個表的記錄達到千萬級別的話,查詢速度會很慢的。根據業務上合適的規則對數據庫進行分區分表,可以有效提高數據庫的訪問速度,提升服務器的整體性能。另外對於業務上查詢請求,在建表的時候可以根據相關需求設置索引等,以提高查詢速度。

6.選擇合適的IO模型

IO模型又分為:

(1).阻塞I/O模型:數據沒到達之前,I/O一直阻塞,如果數據到達,則會返回。典型的是recvfrom,一般的默認都是阻塞的。

(2).非阻塞的I/O模型:和阻塞相反,只要不能得到結果的時候,I/O立刻返回。不會阻塞當前線程。

IO複用模型:也就是自己要學習的部分。多路複用的意思是,將多路信號合併到一路上進行處理,類似多個管道彙集到一個管道,與之相反的是多路分解。

IO複用模型主要是select,poll,epoll;對一個IO端口,兩次調用,兩次返回,比阻塞IO並沒有什麼優越性;關鍵是能實現同時對多個IO端口進行監聽;函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。

信號驅動:首先開啟套接口信號驅動I/O功能,並通過系統調用sigaction安裝一個信號處理函數。當數據報準備好被讀時,就為該進程生成一個SIGIO信號。隨即可以在信號處理程序中調用recvfrom來讀數據報,井通知主循環數據已準備好被處理中。也可以通知主循環,讓它來讀數據報。

異步的IO模型:告知內核啟動某個操作,並讓內核在整個操作完成後(包括將數據從內核拷貝到用戶自己的緩衝區)通知我們。這裡並不是說一定要用某個模型,epoll也並不是在所有情況下都比select性能要好的,在選擇的時候還是要結合業務需求來。

服務器性能優化的8種常用方法

7.使用多核處理策略

現在運行服務器的主流機器配置都是多核CPU的,我們在設計服務器的時候可以利用多核心的特點,採用多進程或者多線程的框架。關於選擇多線程還是多進程可以根據實際的需求,結合各自的優缺點進行選擇。對於多線程的使用,特別是使用線程池的時候可以通過測試不同線程池服務器的性能來設置合適的線程池。

8.分佈式部署程序

當單機服務器已經找不到合適的優化點時,我們可以通過分佈式部署來提高服務器的響應能力。優秀的服務器開發都會為自己的服務器的擴容,容災提出一些解決方案。個人覺得服務器設計的時候簡單點比較好,這樣後期擴容的時候會很方便。

服務器性能優化的8種常用方法

"

相關推薦

推薦中...