mat ong nguyen chat barrie tu dong cong inox tu dong cong xep inox tu dong

Trang chủ/Giải pháp/ Phát hiện, phòng tránh, và loại trừ các tắc nghẽn hệ thống (tiếp)

Phát hiện, phòng tránh, và loại trừ các tắc nghẽn hệ thống (tiếp)

Chú ý rằng Hình 1 biểu thị việc Ghi sau khi quá trình Ghi đầu tiên hoàn thành một nửa như trên biểu đồ, đối với việc chạy -i0, và sau đó biểu thị thực thi việc Đọc cho -i1 cho một nửa còn lại trên biểu đồ, như trong Hình 2 và Hình 3. Rõ ràng, ổ đĩa SATA 2.5″ trong chiếc máy tính xách tay của tôi bị một tắc nghẽn với tốc độ của I/O khoảng 20MB/sec. Đối với thực thi truy cập lớn hơn đến dữ liệu lưu trữ, tôi cần một thiết bị nhanh hơn, như ổ đĩa SAS (10,000 RPM), dãy đĩa RAID, hay một SSD.

4

Trong Hình 2, tốc độ vận chuyển 64K của đĩa I/O dường như phù hợp với hệ thống tệp NTFS trong cả việc Đọc và Ghi.

5

Trong Hình 3, bạn có thể thấy rằng với các hệ thống tệp NTFS, có một thuận lợi rất lớn đối với các bộ đệm Ghi, chúng giữ hàng chờ Ghi xuống ít hơn năm I/O và độ trễ dưới 50 mili giây. Mặc dù vậy, đối với việc Đọc, bạn thấy một kịch bản khác hoàn toàn, với độ trễ lên tới 500 mili giây và một hàng chờ đọc với 35 đến 40 I/O. Bảng 1 là kết quả IOzone cho ổ đĩa SATA trong chiếc máy tính xác tay của tôi, IOzone chạy trong một thư mục trên Windows XP với hệ thống tệp NTFS. IOzone cũng chạy giống như trên Linux, và bạn có thể sử dụng iostat để giám sát các số liệu

Tải trọng KB/s
Ghi lần đầu 17476.48
Ghi lại 17407.94
Đọc lại 6595.88
Đọc Ngẫu nhiên 6080.07
Ghi Ngẫu nhiên 9378.40

Các công cụ hữu ích khác để điều khiển I/O hay mạch điều khiển mạng và phân tích kết quả:

  • Netperf, dành cho việc tạo ra các gói tin TCP hay giao thức gói dữ liệu người dùng (UDP) trên Linux.
  • Wireshark, dành cho giao thức mạng IP và phân tích thực thi trên cả máy chủ Linux và Windows.
  • SYSSTAT dành cho Linux.
  • Microsoft SQLIO dành cho Windows, nó cung cấp phân phối độ trễ.

Tôi không trình bày chi tiết các công cụ này ở đây, nhưng tất cả các công cụ này đều dễ nghiên cứu và sử dụng. Khả năng điều khiển I/O tới lưu trữ hay các giao diện mạng và để tập hợp và phân tích lưu lượng I/O, tất cả những điều này đều rất cần để phát hiện ra các tắc nghẽn I/O.

Bạn có thể loại trừ các tắc nghẽn I/O và lưu trữ theo nhiều cách khác nhau, nhưng bạn phải xem xét cẩn thận về mặt chi phí, sự thực thi, và cân bằng dung lượng. Các lựa chọn dành cho việc biến đổi quy mô hệ thống từ các đĩa SATA/SAS được đính kèm trực tiếp, được tìm thấy trong các máy chủ:

  • Nâng cấp HDD trục xoay lên SSD.
  • Các bộ đĩa và các mạch điều khiển RAID trong máy chủ (có thể mở rộng lên tới 8 đĩa SFF 2.5″ SAS trong 2RU hay 16 trong 4RU— ví dụ, các máy chủ IBM System x®).
  • Các dãy đĩa RAID được đính kèm SAN có thể mở rộng I/O ngẫu nhiên lên tới petabyte và gigabyte.
  • Các đầu và cổng NAS cung cấp các dịch vụ tệp cho các máy khách.

Lựa chọn SSD nói chung bao gồm cả đĩa RAM và đĩa flash. Cả hai chi phí rất đắt nhưng tất nhiên chúng cung cấp sự thực thi tối ưu với một dung lượng rất nhỏ. Hiện nay, nhiều nhà cung cấp đã đưa ra các sản phẩm SSD. Thực thi chính xác nhưng chi phí trên một gigabyte ít nhất cũng cao gấp 10 đến 20 lần so ổ đĩa quay. Đĩa RAID tất nhiên có giới hạn, nhưng 16 trục quay có thể loại trừ tắc nghẽn lưu trữ I/O cho nhiều ứng dụng cần tới hàng trăm megabyte để thực thi. Đối với những ứng dụng cần tới hàng gigabyte để thực thi, thì sự lựa chọn tốt nhất là SAN hay NAS. Ở đây, bạn có rất nhiều lựa chọn, nhưng một trong những lựa chọn tốt nhất là thừa số biểu mẫu nhỏ, dãy đĩa dày như là Atrato v1000 (xem Tài nguyên), nó sử dụng một mạch điều khiển IBM System x3650.

Các tắc nghẽn bộ xử lý thường xảy ra với các ứng dụng điện toán lớn như là xử lý tệp ảnh hay các thuật toán là các NP-hard. Bình thường, rất nhiều hệ thống có bộ xử lý dự phòng; nhưng thực tế, chúng có thể gây tốn điện hay tỏa nhiệt lớn trong khi nó lại không giúp cải thiện nhiều cho tổng thể thực thi hệ thống. Khi bạn phát hiện một tắc nghẽn bộ xử lý, bạn (cơ bản) có ba tùy chọn để loại trừ nó:

  • Thêm tài nguyên bộ xử lý.
  • Tối ưu các mã trình ứng dụng để sử dụng các tài nguyên bộ xử lý một cách hiệu quả hơn.
  • Thêm các động cơ giảm tải máy chủ cho các xử lý liên quan tới I/O lưu trữ và mạng.

Thêm các tài nguyên bộ xử lý bằng cách thêm các bộ xử lý đa lõi. Việc này giúp các ứng dụng được phân luồng và các hệ thống hoạt động máy chủ có thể cân bằng nạp qua nhiều lõi khác nhau: Điều này rất phổ biến hiện nay. Bạn có thể tối ưu hóa bằng cách sử dụng các công cụ định hình, nhưng thường thực hiện như vậy đòi hỏi người phát triển phải mất nhiều thời gian để mã hóa lại các ứng dụng và kiểm tra hồi quy sau khi kết thúc tối ưu hóa. Đưa thêm các lõi bộ xử lý vào các điểm tắc nghẽn thường là phương pháp đơn giản nhất, nhưng nó sẽ làm tăng lượng tiêu thụ điện. Phương pháp trước đây là nâng cấp tốc độ xung nhịp bộ xử lý không tạo được hiệu quả vì nó tiêu tốn điện lớn, tỏa nhiệt nhiều, và những vấn đề thiết kế phần cứng không đáp ứng tốc độ GHz. Phần này đề cập các công cụ định hình để tối ưu hóa mã trình và luồng đa lõi. Các máy chủ giảm tải với các động cơ giảm tải I/O như là TOE cũng là một lựa chọn đáng để xem xét.

Các tài nguyên bộ xử lý có kích cỡ tương ứng dựa trên định hình ứng dụng và phân tích tổ hợp các thuật toán là cách tốt nhất để tránh một tắc nghẽn bộ xử lý. Phép đo lường để đo MIPS và FLOPS cũng rất hữu ích, nhưng nói chung, một trong những cách để thiết lập kích cỡ cho bộ xử lý bạn cần là chạy các kiểm tra với các ứng dụng thực và định hình đơn giản và ước lượng biến đổi quy mô hệ thống với tốc độ xung nhịp và khả năng thực hiện tính toán song song giữa một ứng dụng tồn tại. Xem lại luật Amdahl:

Speedup = 1 / [(1 – P) + (P/N)]

nơi P là một phần của thuật toán có thể được tạo song song và N là số bộ xử lý. Tất nhiên trong trường hợp tốt nhất, tốc độ là 1/[1/n], trong đó N cho thuật toán song song hay ứng dụng. Rất nhiều ứng dụng có thể song song, những một trong đó không thể như vậy, nên đây là một xem xét cơ bản trước khi đầu tư thêm nhiều lõi bộ xử lý và cố gắng phân luồng một ứng dụng. Việc hiểu rõ tổ hợp thuật toán bên dưới và liệu nó là P, NP-Complete, hay NP-hard, là vấn đề rất cơ bản. (NP có nghĩa là một thuật toán sẽ chạy trong thời gian đa thức, không xác định.)

Hoàn toàn không thực tế khi tin rằng bạn có thể tránh một tắc nghẽn bộ xử lý bằng cách viết lại thuật toán NP thành thuật toán tổ hợp P, nhưng hy vọng điều đó sẽ xảy ra. Nhiều sự tối ưu hóa và các thuật toán đồ thị giao nhau rất hữu ích nhưng NP-hard thì không. Tổ hợp thuật toán có thể cũng đơn giản, nhưng những yêu cầu cao tầng cho các điện toán cũng có thể làm tràn một bộ xử lý; trong những trường hợp này, bạn có thể thường sử dụng giảm tải để tránh tắc nghẽn bộ xử lý. Ví dụ, bạn có thể sử dụng những đơn vị xử lý đồ họa (GPU) để giảm tải cho các hoạt động xử lý hình ảnh đơn giản. Những hoạt động này bao gồm những hoạt động đơn giản nhưng trong đó các hình ảnh có dung lượng hàng triệu pixel. Lý tưởng, phòng tránh là biện pháp tốt nhất, nhưng mã trình thường được sử dụng lại hay các ứng dụng được chứa, và nó cần thiết phải tìm ra nguồn tắc nghẽn của bộ xử lý. May mắn là có rất nhiều công cụ giúp để thực hiện điều này.

Chi tiết về phân tích tắc nghẽn bộ xử không được đề cập trong bài viết này, nhưng bạn có thể tìm hiểu sâu hơn trong các bài viết như là “Các bài học lớn, Phần 3: Điều chỉnh và giám sát thực thi.” Tổng thể, các phương pháp này có thể được tổng kết như dưới đây:

  • Chạy định hình thời gian của các ứng dụng để quyết định độ dài đường dẫn của thuật toán (số lượng của chỉ dẫn cho một khối mã trình).
  • Chạy định hình thời gian để quyết định sự thi hành hiệu quả của một đường dẫn (bao nhiêu thời gian để đi qua một khối các chỉ dẫn).
  • Phân tích hiệu của của đường ống dẫn bộ xử lý (một đường ống dẫn có thể ngưng hoạt động vì thiếu lưu trữ tạm thời, phụ thuộc dữ liệu và I/O, thiếu sự dự báo như là thiếu sự dự báo brand.)
  • Phân tích luồng để quyết định hoạt động luồng và nạp cân bằng cho ánh xạ tới các lõi bộ xử lý.

Bởi vì các công cụ cho những phương pháp này đã được đề cập chi tiết trong các bài viết khác, nên tôi chỉ cung cấp danh sách những công cụ thường được dùng:

  • PerfMon trên Windows
  • Intel® VTune và các công cụ đơn vị giám giát thực thi (PMU) khách dành cho Linux và Windows
  • Oprofile cho Linux
  • pfmon cho Linux
  • Valgrind cho Linux, những công cụ này giúp tìm ra các luồng lõi

Loại trừ các tắc nghẽn bộ xử lý cũng giống như việc tránh tắc nghẽn bằng sử dụng kích thước tài nguyên bộ xử lý một cách thích hợp, giảm tải, phân luồng cho các điện toán song song, và hiểu tổ hợp thuật toán bên dưới. Điều này thường yêu cầu phải mã hóa lại các ứng dụng, điều này cần một chi phí lớn. Có lẽ cách đơn giản nhất để cải thiện hiệu quả là kiểm tra với các mức độ tối ưu hóa trình biên dịch mà không thay đổi mức nguồn cao, nhưng kiểm tra hồi quy vẫn rất cần thiết trong trường hợp này. Thay vì phân luồng cho các điện toán song song, các phương pháp khác không dược thiết kế từ đầu cho đồng quy tối đa hay giảm tải (ví dụ, GPUs, TOEs) đối với các hàm, loại trừ các tắc nghẽn bộ xử lý yêu cầu tối ưu hóa mã trình bằng thủ công hay kỹ thuật trình biên dịch.

Các tắc nghẽn bộ nhớ rất phổ biến với nhiều ứng dụng khi chúng không thể khít với lưu trữ tạm thời đặc biệt bởi vì thời gian truy cập của bộ nhớ DRAM ngoài chậm hơn tốc độ xung nhịp của lõi bộ xử lý. Các tắc nghẽn bộ nhớ thường xuất hiện như là các tắc nghẽn bộ xử lý, nhưng bạn có thể phân biệt chúng qua sự định hình, nó cho biết thi hành thiếu hiệu quả của các thuật toán bởi vì các đường ống bộ xử lý ngưng hoạt động do phụ thuộc dữ liệu và vòng chờ trong khi dữ liệu được đưa vào lưu trữ tạm thời

Tránh các tắc nghẽn bộ nhớ yêu cầu bộ nhớ cần được nâng cấp không chỉ về dung lượng mà còn về truy cập dải tần tại độ trễ hợp lý. Thêm nữa, ánh xạ tới bộ nhớ vật lý cũng rất quan trọng và thường được cung cấp bởi một hệ thống hoạt động, nhưng nó vẫn cần bạn giám sát cẩn thận.

Bạn có thể phát hiện các tắc nghẽn bộ nhớ bằng cách chạy ứng dụng và định hình truy cập bộ nhớ và thực thi lưu trữ tạm thời. Nếu bạn không lựa chọn chạy ứng dụng, thì việc chạy một tải trọng truy cập bộ nhớ là một sự lựa chọn thay thế tốt nhất (xem Ví dụ 1). Một cách để thực hiện điều này là truy cập bộ nhớ qua một đĩa RAM, sử dụng các công cụ tạo ra tải trọng I/O được miêu tả trong phần Công cụ và kỹ thuật: Phát hiện các tắc nghẽn I/O, của bài viết này.

# mke2fs -m 0 /dev/ram0
# mount /dev/ram0 /mnt/rd1
# dd if=/dev/zero of=/mnt/ramdisk1/newfile bs=128K
count=40 40+0 records in 40+0 records out
5242880 bytes (5.2 MB) copied, 0.00413 seconds, 1.3 GB/s
# dd if=/mnt/ramdisk1/newfile of=/dev/null bs=128K
count=40 40+0 records in 40+0 records
out 5242880 bytes (5.2 MB) copied,
0.001595 seconds, 3.3 GB/s
# cd /mnt/ramdisk1
#/usr/bin/iozone -R -s512K -r128k -t 16 -T   ”
Initial Write ” 1619525.94  ”
Rewrite ” 1410215.12  ”           Read ” 2124526.50  ”
Re-read ” 2178404.50  ”
Reverse Read ” 2207515.50  ”    Stride Read ” 3196584.25  ”
Random Read ” 2655129.25  ”
Mixed workload ” 2638816.00  ”   Random Write ” 1895721.12  ”
Pwrite ” 1827433.56  ”
Pread ” 2196227.25

Loại trừ các tắc nghẽn bộ nhớ thường bao gồm việc nâng cấp cấu trúc máy chủ và các chipset để giúp hub mạch điều khiển bộ nhớ (MCH) chạy nhanh hơn, kỹ thuật DRAM nhanh hơn, như là, hay việc nâng cấp kích cỡ lưu trữ tạm thời L1/L2/L3 trên cấu trúc máy chủ hiện tại của bạn, nếu thiếu lưu trữ tạm thời sẽ làm quá trình thi hành bị chậm. Trước khi mua thêm lưu trữ tạm thời, bạn cần chắc chắn rằng việc thiếu lưu trữ tạm thời thực sự làm chậm các ứng dụng vì quá trình thi hành không đủ năng lực:

  • Sử dụng các công cụ định hình và PMU, như là VTune để phát hiện các điểm thiếu lưu trữ tạm thời.
  • Sử dụng cat /proc/meminfo trong Linux để giám sát việc sử dụng.
  • Sử dụng lệnh pmap và vmstat trong Linux.
  • Sử dụng valgrind cho Linux, nó giúp tìm ra các lỗi quản lý bộ nhớ

Tin liên quan