Bộ nhớ chia sẻ phân tán

Một phần của tài liệu Tối ưu hoá ứng dụng ngân hàng trên nền hệ thống phân tán777 (Trang 56)

Như ta biết, có hai loại hệ thống nhiều bộ xử lí: multiprocessor và multicomputer. Trong hệ thống multiprocessor, hai hoặc nhiều CPU cùng chia sẻ một bộ nhớ chính chung, còn trong hệ thống multicomputer, mỗi CPU có một bộ nhớ riêng, không chia sẻ.

Về mặt phần cứng, việc thiết kế một hệ thống đa bộ xử lí sử dụng chung bộ nhớ là rất khó, đối với hệ thống bus-based multiprocessor thì sẽ dẫn tới tình

switched multiprocessor thì việc mở rộng hệ thống trở nên tốn kém và khó duy trì hoạt động hơn. Ngược lại, các hệ thống multicomputer dễ xây dựng hơn.

Về mặt phần mềm, có rất nhiều phương pháp lập trình đa bộ xử lí. Để thông tin với nhau, một tiến trình chỉ phải ghi dữ liệu vào bộ nhớ, để các tiến trình khác đọc dữ liệu này trên bộ nhớ chia sẻ. Để đồng bộ, ta sử dụng các vùng tới hạn, với các semaphore hay các bộ giám sát để tạo cơ chế loại trừ lẫn nhau khi cần thiết. Với các hệ thống multicomputer thì ngược lại, để thông tin với nhau phải dùng cơ chế truyền thông điệp khá phức tạp về điều khiển luồng,

xử lí các thông điệp bị thất lạc, buffering và blocking. Một dạng trao đổi thông tin trong hệ thống multicomputer là RPC, sử dụng thư viện các thủ tục. Để sử dụng các dịch vụ từ xa, tiến trình phải gọi thủ tục phù hợp, đóng gói các mã lệnh và các thông số của thủ tục vào trong thông điệp, gửi vào mạng và chờ phản hồi. Tuy nhiên nó cũng có nhược điểm vì với các cấu trúc dữ liệu phức tạp chứa con trỏ, và các biến toàn cục, các array lớn thì rất khó để trao đổi qua các thông điệp. Như vậy các hệ thống kiểu multiprocessor sẽ thích hợp hơn.

Tóm lại, hệ thống multicomputer thì dễ xây dựng nhưng khó lập trình, còn hệ thống multiprocessor thì khó xây dựng nhưng dễ lập trình.

Ta sẽ xây dựng hệ thống đạt được ưu điểm của cả hai mô hình trên. 1.6.1 Giới thiệu:

Trong giai đoạn đầu của hệ thống tính toán phân tán, các chương trình chạy trên các máy khác nhau, không chia sẻ bộ nhớ, việc trao đổi giữa các máy được thực hiện qua cơ chế truyền thông điệp.

Có một phương pháp là không chia sẻ toàn bộ không gian địa chỉ mà chỉ chia sẻ một phần, chủ yếu là các biến và cấu trúc dữ liệu mà nhiều tiến trình cùng sử dụng. Giải pháp này sẽ làm giảm số lượng dữ liệu phải chia sẻ đồng thời ta

cũng biết được các thông tin cần thiết về dữ liệu được chia sẻ để tối ưu hoá việc triển khai.

Một phương pháp khác là tạo các bản sao các biến chia sẻ trên các máy khác

nhau. Thao tác đọc có thể được thực hiện một cách local còn thao tác ghi được thực hiện thông qua giao thức cập nhật nhiều bản ghi.

Không gian địa chỉ cần chia sẻ chủ yếu là các đối tượng và phương thức của đối tượng đó.

1.6.2 Bộ nhớ chia sẻ:

Ta sẽ xem xét các loại hệ thống shared memory multiprocessor từ loại đơn giản nhất là hoạt động trên một bus tới loại sử dụng cache là loại phức tạp nhất. Sở dĩ ta chỉ xem xét các hệ thống multiprocessor là vì các giải thuật của

hệ thống multiprocessor và multicomputer khá tương tự nhau khi cùng sử dụng bộ nhớ chia sẻ.

Hình 1.27: (a) single-chip computer, (b) đa xử lí chia sẻ bộ nhớ giả thiết. 1.6.2.1 On chip Memory:-

Trong mô hình này, CPU có các đường địa chỉ và dữ liệu nối trực tiếp đến bộ nhớ. Trong hình 1.27(a) là máy tính với mô hình CPU và bộ nhớ đơn giản, hình 1.27(b) là mô hình nhiều bộ xử lí cùng chia sẻ một bộ nhớ.

1.6.2.2 Bus based multiprocessors:-

Phương pháp đơn giản và hiệu quả nhất để xây dựng multiprocessor là tạo một bus để các CPU kết nối tới. Để tránh trường hợp có hai hay nhiều hơn CPU cùng truy suất vào bộ nhớ, người ta dùng một số phương pháp chia sẻ bus. Ví dụ, để được truy suất file, CPU phải gửi yêu cầu của nó vào một đường đặc biệt, khác với đường địa chỉ và đường dữ liệu, để được quyền sử dụng bus. Chức năng cấp quyền cho CPU có thể được thực hiện tập trung tại một thiết bị đặc biệt hoặc yêu cầu quyền này qua các CPU trên bus.

Nhược điểm của phương pháp này là khi số lượng CPU tăng lên thì bus có thể bị quá tải. Để giảm tải cho bus, người ta sử dụng snooping cache (còn gọi là snoopy cache). Sử dụng cache có thể gây ra tình trạng không toàn vẹn dữ liệu, nên người ta phải dùng một số biện pháp để đảm bảo tính toàn vẹn dữ liệu cho cache. Biện pháp thông dụng nhất là write through, khi CPU đọc một từ từ bộ nhớ, từ này sẽ được lưu trong cache của CPU để dùng lại khi cần. Mỗi CPU thực hiện lưu cache độc lập nhau, do đó có thể có trường hợp một từ nào đó được lưu trên nhiều CPU khác nhau. Khi thực hiện thao tác viết, nếu không có CPU nào có từ này trong cache thì bộ nhớ chính sẽ được cập nhật, như trường hợp không sử dụng cache. Nếu CPU thực hiện lệnh cập nhật chỉ có một bản sao của từ này thì cache của nó sẽ được cập nhật và bộ nhớ cũng sẽ được cập nhật thông qua bus. Khi CPU muốn cập nhật từ mà đã được nhiều CPU lưu trong cache thì, nếu từ đó đang được lưu trong cache của CPU này, nó sẽ được cập nhật, nếu không nó sẽ được gửi tới bus để thực hiện cập nhật vào bộ nhớ. Các cache của các CPU khác sẽ theo dõi quá trình cập nhật này

(thông qua việc snooping) để kiểm tra xem cache của nó đã được cập nhật chưa. Nếu chưa cập nhật, từ chứa trong cache của nó sẽ bị vô hiệu hoá để hoàn thành việc cập nhật bộ nhớ, như vậy sau đó chỉ có CPU thực hiện việc cập nhật là lưu thông tin về từ đó trong cache. Từ đã chứa trong cache của các CPU khác cũng có thể được cập nhật (cần cung cấp giá trị mới của từ) thay vì bị vô hiệu hoá (đơn giản chỉ là xóa địa chỉ trỏ đến từ này), nhưng quá trình này sẽ tốn nhiều thời gian hơn quá trình vô hiệu hoá.

Giao thức đảm bảo tính toàn vẹn của cache được tổng kết như trong hình ?. Cột thứ nhất là 4 sự kiện có thể xẩy ra, cột thứ 2 là phản ứng của cache với CPU chứa nó, cột thứ 3 là hoạt động của cache khi nó phát hiện thấy có CPU khác truy suất bộ nhớ. Lần duy nhất mà cache phải thực hiện là khi nó phát hiện thấy có một CPU khác đang ghi lên từ mà nó có lưu trong cache, nó sẽ xoá từ này khỏi cache.

Biện pháp write through đơn giản và dễ thực hiện, nhưng trong thực tế, khi - một CPU đã ghi lên từ thì nó vẫn có xu hướng tiếp tục sử dụng từ này cho các thao tác tiếp theo, làm ảnh hưởng đến quá trình cập nhật từ này vào cache của

các CPU khác. Để giải quyết vấn đề này, Goodman (1983) đã đưa ra giải

thuật write once. Ngoài ra Archibald và Baer (1986) đưa ra một giải thuật khác, giải thuật này quản lí các cache block, mỗi cache block tồn tại ở một trong 3 trạng thái sau:

1. INVALID: cache chứa dữ liệu không hợp lệ

2. CLEAN: Bộ nhớ đã được cập nhật, block này có thể đang nằm trên các cache khác.

3. DIRTY: Bộ nhớ không chính xác, các cache khác không lưu block này Ý tưởng của phương pháp này là từ đang được đọc bởi nhiều CPU có thể hiện diện trên tất cả các cache của nó, từ đang được ghi bởi chỉ một máy được lưu

trên cache của máy đó và không phải cập nhật từ này vào bộ nhớ sau mỗi thao tác ghi để giảm việc trao đổi qua bus.

Ví dụ về thực hiện thao tác này được mô tả trong hình ?.

Nhiều bộ xử lí nhỏ sử dụng giải thuật đảm bảo tính toàn vẹn dữ liệu trên cache như trên với một số thay đổi nhỏ. Giải thuật này có 3 đặc tính quan trọng sau:

1. Tính toàn vẹn sẽ được đảm bảo khi tất cả các cache đều thực hiện bus snooping

2. Giải thuật này được tích hợp trong khối quản lí bộ nhớ 3. Toàn bộ giải thuật này được thực hiện trong một chu kì nhớ 1.6.2.3 Ring based multiprocessors:-

Ta sẽ minh hoạ hoạt động của ring-based multiprocessor thông qua hoạt động của cơ chế Memnet. Trong Memnet, không gian địa chỉ đơn được chia thành

2 phần, riêng và chia sẻ. Phần riêng được chia thành các vùng để cho mỗi máy có chỗ lưu các stack và các dữ liệu, code không chia sẻ khác. Phần chia sẻ được dùng chung cho tất cả các máy và được bảo đảm tính toàn vẹn bằng giải thuật cứng như trong hệ thống bus based multiprocessor. Bộ nhớ chia sẻ - được chia thành các khối 32 byte, đây là đơn vị nhớ trao đổi của các máy. Tất cả các máy trong Memnet được nối với nhau thông qua vòng token, vòng này bao gồm 20 dây song song với 16 bit dữ liệu và 4 bit điều khiển được gửi đi sau mỗi 100 nanô giây, tốc độ truyền dữ liệu sẽ là 160Mbps, như mô tả trong hình 1.28(a). Giao diện vòng ring, MMU(Memory Management Unit), cache, và môt phần bộ nhớ được tích hợp trong Memnet device, như trong hình 1.28(b).

Hình 1.28: (a) Vòng Memnet, (b) máy đơn, (c) bảng block

Không giống như trong bus based multiprocessor, trong Memnet không có bộ - nhớ tập trung mà thay vào đó, các khối 32 byte trong không gian địa chỉ chia sẻ có home machine trên đó luôn có bộ nhớ vật lí dành riêng cho nó (trong

trường home memory). Một khối có thể được lưu trong các máy khác chứ không phải lưu trên cache của home machine. Khối chỉ đọc có thể hiện diện trên nhiều máy, khối đọc ghi chỉ có thể hiện diện trên một máy. Trong cả 2 trường hợp, khối không cần hiện diện trên home machine của mình. Tất cả

các home machine đều dành một vùng nhớ để lưu khối nhớ này nếu không máy nào lưu nó. Memnet device trên mỗi máy đều chứa một bảng, như trong hình ?(c), bảng này chứa thực thể tương ứng với khối nhớ trong không gian chia sẻ, được đánh số bằng số hiệu block. Mỗi thực thể trong bảng có một bit Valid để chỉ đây có phải là bản sao local của block hay không, bit Home để chỉ ra máy hiện tại là home machine, bit Interrupt dung để thực hiện các ngắt, trường Location chỉ nơi lưu block trong cache nếu nó hiện diện hợp lệ.

Trên đây là cấu trúc của Memnet, ta sẽ xem xét các giải thuật mà nó sử dụng. Khi CPU cần đọc từ trong vùng nhớ chia sẻ, địa chỉ bộ nhớ định đọc sẽ được chuyển tới Memnet device, Memnet device sẽ kiểm tra bảng block để kiểm tra xem khối nhớ có hiện diện trong cache của CPU này không, nếu có thì sẽ

đáp ứng ngay. Nếu không Memnet device sẽ chờ cho đến khi nhận được token, đặt gói yêu cầu vào vòng ring và tạm thời dừng CPU. Gói yêu cầu chứa địa chỉ và block 32 byte.

Khi gói tin này di chuyển trong vòng ring, mỗi Memnet device trong vòng ring sẽ kiểm tra xem nó có chứa block đó không, nếu có thì sẽ đặt nó vào khối nhớ 32 byte đi kèm gói tin và thay đổi header của gói để ngăn chặn các máy tiếp theo thực hiện lại thao tác này, nếu bit Exclusive của khối đã được lập thì sẽ bị xoá. Vì khối nhớ này phải nằm đâu đó trong vòng ring, nên khi token quay trở lại nơi gửi gói tin thì sẽ đảm bảo có được thông tin về nơi chứa block này. CPU gửi yêu cầu sẽ lưu khối nhớ, đáp ứng các yêu cầu tiếp theo và giải phóng CPU.

Vấn đề này sinh khi máy gửi yêu cầu không còn đủ không gian nhớ để lưu khối nhớ mà nó nhận được, để tạo thêm không gian trống, nó sẽ chọn ngẫu nhiên các khối nhớ trong cache để gửi về bộ nhớ chính và giải phóng vùng nhớ tương ứng của khối nhớ này.

Nếu block chứa từ định ghi đang hiện diện và là bản sao duy nhất trong hệ thống (bit Exclusive đã được lập) thì từ này sẽ được cập nhật.

Nếu block đang hiện diện không phải là bản sao duy nhất thì trước hết một gói tin invalidation sẽ được gửi vào vòng ring để các máy khác loại bỏ các bản sao của block này trong cache của mình. Khi gói tin này trở về, bit Exclusive được thiết lập để quá trình ghi được thực hiện.

Nếu block này không hiện diện trong cache, một gói tin sẽ được gửi đi bao gồm yêu cầu đọc và yêu cầu invalidation. Máy đầu tiên có block nhận được gói tin này sẽ copy nó vào gói tin và loại bỏ bản sao tương ứng trong cache của mình, các máy tiếp theo sẽ lần lượt xoá block khỏi cache. Khi gói tin trở về nơi gửi, nó sẽ chứa các thông tin cần thiết.

Memnet hoạt động tương tự như bus-based multiprocessor. Trong cả 2 trường hợp, thao tác đọc luôn thu được giá trị cập nhật, block hiện diện trên tất cả các cache, trong thao tác ghi, block hiển diện trên duy nhất một cache của CPU đang thực hiện thao tác ghi này. Tuy nhiên Memnet không có bộ nhớ toàn cục tập trung.

1.6.2.4 Switched multiprocessors:

Các hệ thống bus-based multiprocessor và ring-based multiprocessor hoạt động tốt với các hệ thống nhỏ (tối đa khoảng 64 CPU), khi hệ thống mở rộng đến hàng trăm hoặc hàng ngàn CPU thì không còn phù hợp nữa. Khi thêm một CPU vào hệ thống thì băng thông của bus hoặc vòng ring sẽ bị ảnh hưởng và CPU này không làm tăng thêm performance của hệ thống.

Hai giải pháp để giải quyết vấn đề băng thông là: 1. Giảm lượng trao đổi thông tin

Giải pháp giảm lượng trao đổi thông tin đã được đề cập với việc sử dụng cache, ta có thể cải tiến thêm bằng cách cải thiện giao thức caching, tối ưu hoá kích thước block, tổ chức lại các chương trình …

Hình 1.29: (a) Ba cluster kết nối với một bus liên cluster để hình thành một siêu cluster, (b) Hai siêu cluster kết nối với nhau bằng một bus siêu cluster. Để tăng khả năng trao đổi thông tin trong hệ thống, người tat thay đổi topo mạng kết nối của bus và vòng ring. Để có thể thêm CPU vào hệ thống chỉ có một bus, người ta xem toàn bộ CPU và bus là một thực thể thống nhất, hay

còn gọi là cluster. Xây dựng hệ thống dựa trên các cluster và kết nối các cluster bằng các bus liên cluster như trong hình ?. Khi CPU chủ yếu trao đổi với nhau trong nội bộ cluster thì lưu lượng trao đổi thông tin trên liên cluster là không đáng kể. Nếu dùng một bus liên cluster là không đủ thì có thể thêm vào bus liên cluster thứ 2 hoặc tổ chức các cluster thành dạng cây (tree) hoặc mạng lưới (grid). Nếu cần thêm băng thông ta có thể tập hợp các bus, tree

hoặc mạng lưới cluster với nhau tạo thành siêu cluster. Hình 1.29(b) mô tả một hệ thống với 3 mức bus (dự án nghiên cứu ở đại học Stanford, với máy Dash-303)

1.6.2.5 NUMA multiprocessors:

Ngoài các mô hình sử dụng cache, người ta có thể xây dựng các hệ thống với kiến trúc không dùng cache như NUMA (NonUniform Memory Access) multiprocessor. Giống như các hệ thống UMA multiprocessor truyền thống, máy NUMA cũng có một không gian địa chỉ ảo và chia sẻ cho tất cả các CPU, khi một CPU cập nhật giá trị cho a, thao tác đọc giá trị của a tiếp theo của CPU khác sẽ trả về giá trị vừa ghi.

Điểm khác biệt của UMA và NUMA là ở performance. Trong máy NUMA, truy suất tới bộ nhớ ở xa sẽ chậm hơn rất nhiều so với truy suất bộ nhớ nội bộ, tỉ lệ này là 10:1 tuỳ theo yêu cầu.

Một ví dụ về các bộ đa xử lí NUMA:

Để hiểu rõ cơ chế làm việc của NUMA, ta sẽ nghiên cứu hoạt động của máy

Một phần của tài liệu Tối ưu hoá ứng dụng ngân hàng trên nền hệ thống phân tán777 (Trang 56)

Tải bản đầy đủ (PDF)

(103 trang)