Trên mỗi nút ta tính toán tốc độ xử lý gói tin tối đa mà nút đó có thể xử lý được, ta có thể tính toán giá trị đó thông qua tốc độ xử lý và đường truyền của máy. Việc tính toán này không nằm trong nội dung của khóa luận này. Ta quy định trên mỗi nút sẽ tồn tại hai giá trị giới hạn gọi là hardLimitRate và softLimitRate, lần lượt ứng với tốc độ xử lý tối đa của máy trên một đơn vị thời gian: limitRate và x*limitRate (với x là hằng số 0<x<1). Khi tốc độ gói tin tới nút chạm tới mức softLimitRate ta coi như máy đó bước vào giai đoạn “tắc nghẽn mềm” và sẽ tiến
hành các phương thức chống tắc nghẽn với nút đó. Khi tốc độ gói tin tới mức hardLimitRate thì lúc đó máy bị tắc nghẽn hoàn toàn. Việc tính toán giá trị của hằng số x sẽ ảnh hưởng đến độ “nhạy” của việc phát hiện tắc nghẽn, nếu x quá nhỏ các nút sẽ dễ dàng bị coi là tắc nghẽn dù vẫn còn khả năng phục vụ, nếu x quá lớn sẽ khiến cho việc xử lý tắc nghẽn trên nút diễn ra quá muộn dẫn tới trường hợp nút bị tắc nghẽn hoàn toàn kéo theo số lượng gói tin bị loại bỏ sẽ tăng.
4.2.2. Xử lý trong trường hợp có tắc nghẽn
Khi phát hiện “tắc nghẽn mềm” trên nút, nếu nút nhận được một truy vấn tới thì hệ thống sẽ tiến hành các động thái sau:
Nút nhận đang bị tắc nghẽn sẽ gửi gói tin đến nút vừa gửi truy vấn đến nó thông báo mình bị tắc nghẽn. Nút nhận lưu lại danh sách các nút nó đã gửi thông báo tắc nghẽn đến.
Nút gửi truy vấn (có thể là nút vừa chuyển tiếp truy vấn) đến nút tắc nghẽn tiến hành thay đổi bảng định tuyến của nó: chuyển nút tắc nghẽn thành các nút lân cận không bị tắc nghẽn.
Truy vấn đến nút đang bị “tắc nghẽn mềm” vẫn tiếp tục được xử lý như bình thường
Để tiến hành thay đổi bảng định tuyến đồng thời giữ lại giá trị nút đích ban đầu ta thay đổi bảng định tuyến (bảng finger) bằng cách thêm một cột lưu giữ giá trị định tuyến ban đầu. Khi đó bảng finger có dạng ví dụ như sau:
Finger Active Route Origin Route
1 (Pi + 1) Pa Pa
2 (Pi + 2) Pb Pb
3 (Pi + 4) Pc Pc
… … …
M (Pi + 2m) Px Px
Finger Active Route Origin Route 1 (Pi + 1) Pa Pa 2 (Pi + 2) Pt Pb 3 (Pi + 4) Pc Pc … … … M (Pi + 2m) Px Px
Với Pt là successor của Pa. Việc chọn lựa nút thay thế là nút “xa hơn” nút nguồn so với nút ban đầu nhằm mục đích giảm thiểu số lượng nút mà gói tin phải chuyển qua.
Nếu có một truy vấn tới Pi mà theo bảng finger gốc truy vấn đó sẽ chuyển qua nút Pb, thì trong thời điểm này truy vấn đó sẽ được chuyển tới:
Pt nếu khóa của truy vấn không nằm trong khoảng của Pb và Pt
Pb nếu khóa của truy vấn nằm trong khoảng Pb và Pt
Trong trường hợp gói tin đến khi nút đang bị tắc nghẽn hoàn toàn (tốc độ gói tin đến vượt quá hardLimitRate) thì gói tin đó sẽ bị loại bỏ.
4.2.3. Xử lý khi hết tắc nghẽn
Các nút trong hệ thống thực hiện việc kiểm tra định kỳ số lượng truy vấn tới để so sánh với các giới hạn đã có. Khi một nút đang từ trạng thái tắc nghẽn chuyển về trạng thái không tắc nghẽn (có lượng truy vấn tới trong một đơn vị thời gian nhỏ hơn softLimitRate), hệ thống sẽ tiến hành các bước sau:
Nút vừa ra khỏi trạng thái tắc nghẽn sẽ gửi thông báo về tình trạng của mình cho một số nút trong danh sách các nút nó đã gửi thông báo tắc nghẽn mà nó đã lưu lại như mô tả ở bước trên.
Nút nhận được thông báo hết tắc nghẽn sẽ thay đổi các mục có liên quan về nút vừa gửi thông báo trong bảng định tuyến về trạng thái như ban đầu.
Ví dụ như trường hợp trên khi nhận được thông báo hết tắc nghẽn từ Pb, thì Pi sẽ chuyển Pt lại thành Pi trong bảng định tuyến của nó.
Số lượng nút sẽ nhận được thông báo khi nút đích hết tắc nghẽn cũng cần được quan tâm ở đây. Ta chỉ chọn ra một số lượng nhất định trong số các nút trong danh sách nút đã nhận được thông báo tắc nghẽn. Số lượng nút nhận được thông báo hết tắc nghẽn sẽ gián tiếp ảnh hưởng đến mức độ khôi phục lại tải sau tắc nghẽn của một nút, nếu ta đặt giá trị này quá thấp sẽ làm cho nút chậm trở lại trạng thái phục vụ bình thường, nếu như quá cao sẽ dễ làm cho nút bị tắc nghẽn trở lại.
4.3. Ví dụ minh họa
Ta xét một mạng Chord đơn giản với không gian khóa 8 bit để minh họa cho giải pháp vừa đưa ra:
Hình 15: Truy vấn thông thường trên mạng Chord (m=8).
Ta thực hiện việc truy vấn khóa 54 trên nút P8. Hình 13 mô tả quá trình truy vấn thông thường theo đúng như thuật toán ban đầu của Chord. Khi đó bảng finger trên nút P8 có dạng:
Hình 16: Bảng định tuyến ban đầu của nút P8
Giả sử ta phát hiện tắc nghẽn tại nút P42, khi đó nút này sẽ thông báo cho nút nguồn thực hiện truy vấn (nút P8) về tình trạng của mình. Với giải pháp đã nêu ta thực hiện việc thay đổi bảng finger trên nút P8 như sau:
Hình 17: Bảng định tuyến của nút P8 khi xảy ra tình trạng tắc nghẽn trên nút P42.
Trên nút P8 tất cả các mục định tuyến có nút đích là P42 sẽ được thay đổi thành successor của P42 là P48. Khi đó nếu tiếp tục phát sinh truy vấn từ nút P8 mà truy vấn đó theo như bảng finger ban đầu sẽ phải đi qua nút P42 sẽ được thay đổi để đi qua nút P48.
Như hình trên truy vấn thay vì đi qua nút P42 đang tắc nghẽn sẽ được điều chỉnh đi qua nút P48. Số lượng nút mà truy vấn phải đi qua vẫn là 3 bằng với số lượng cần thiết trong trường hợp ban đầu.
Giả sử nút P48 cũng xảy ra tình trạng tắc nghẽn, trên bảng định tuyến nút P8 nút P48 sẽ được thay thế bằng nút P51. Vẫn trên nút P8 giả sử ta cần truy vấn khóa 49. Do 49 thuộc khoảng [42,51) nên truy vấn sẽ phải đi qua nút P42 và được thực hiện như bình thường.
Trong quá trình hoạt động giả sử một số nút có bảng định tuyến đi qua nút P42 đều phải thay đổi để qua nút khácthì khi nút P42 hết tắc nghẽn các nút đã thay đổi bảng định tuyến sẽ được lần lượt phục hồi về trạng thái ban đầu.
4.4. Nhận xét về phương pháp
Ta có thể rút ra một số nhận xét về phương pháp đã nêu ở trên:
Ưu điểm: Có thể thấy đây là một phương pháp đơn giản nhằm điều khiển tắc nghẽn trong mạng Chord. Việc thay đổi định tuyến sẽ giúp tránh khỏi nút tắc nghẽn qua đó tăng khả năng thực hiện truy vấn thành công. Việc thay đổi chỉ tác động một số nhỏ các nút (nút tắc nghẽn và nút nguồn) do đó số lượng gói tin và thông tin phụ cần để thực hiện quá trình thay đổi và phục hồi là không lớn. Hơn nữa việc chọn lựa nút thay thế nút tắc nghẽn như đã trình bày ở trên không làm tăng số lượng nút mà mỗi một truy vấn phải đi qua.
Nhược điểm: Do cơ chế thay đổi nút định tuyến rất đơn giản nên chỉ có thể giới hạn các nút thay thế có định danh nằm trong vùng định danh lân cận với nút tắc nghẽn, mà không xét đến yếu tố là khả năng đáp ứng của nút vào việc quyết định lựa chọn nút thay thế. Ngoài ra việc chuyển đổi có thể tiếp tục nếu như nút đích mới cũng bị tắc nghẽn nên có thể gây đến tình trạng số lượng gói tin thông báo tăng rất cao trong trường hợp toàn bộ các nút trên mạng đều rơi vào trạng thái tắc nghẽn khi không có một cơ chế giới hạn số lần chuyển đổi bảng định tuyến. Hơn thế nữa có thể dễ nhận thấy việc thay đổi đường định tuyến của gói tin không thể giải quyết triệt để tắc nghẽn nếu như các nút trong mạng tiếp tục đẩy tốc độ truy vấn lên quá cao so với khả năng đáp ứng của mạng.
Dù còn tồn tại một số nhược điểm tuy nhiên phương pháp đã nêu có thể giải quyết được vấn đề tắc nghẽn ở mức độ nhẹ đặc biệt là các trường hợp tắc nghẽn cục bộ, qua đó tăng khả năng đáp ứng của toàn mạng. Mặt khác phương pháp
này hoàn toàn có thể kết hợp với các phương pháp điều khiển tắc nghẽn sử dụng phương pháp điều chỉnh lưu lượng đã có nhằm loại bỏ khả năng sụp đổ của mạng khi xảy ra tắc nghẽn ở mức độ cao.
5. Mô phỏng và kết quả
5.1. Mô phỏng
Để kiểm chứng khả năng hoạt động chính xác cũng như những lợi ích đạt được, ta sử dụng một hệ thống mô phỏng mạng Chord và tiến hành cài đặt giải pháp đã đề xuất.
5.1.1. Chương trình mô phỏng
Tổng quan cấu trúc mạng mô phỏng: Do mô hình mạng trên thực tế là rất phức tạp và khó có khả năng thể hiện hoàn thiện trên một chương trình mô phỏng do đó ta chỉ xét đến tính chất đặc trưng có ảnh hưởng lớn tới một hệ thống mạng ngang hàng đó là độ trễ giữa các nút trong mạng.
Mô hình mạng mô phỏng bao gồm:
Nhiều miền (area) chứa một số nút nhất định, các miền độc lập với nhau
Mỗi miền có một nút biên, nút biên này nối với các nút khác theo mô hình hình sao.
Các miền được nối với nhau thông qua liên kết giữa hai nút biên của miền. Liên kết này được đặt ngẫu nhiên một giá trị độ trễ gọi là độ trễ liên miền.
Liên kết giữa các nút trong miền và nút biên cũng được lấy ngẫu nhiên một giá trị độ trễ gọi là độ trễ nội miền. Độ trễ nội miền sẽ nhỏ hơn nhiều so với độ trễ liên miền.
Với mô hình trên ta có thể tính toán được độ trễ giữa hai nút trong mạng bằng cách cộng giá trị độ trễ nội miền và liên miền của hai nút đó (nếu hai nút cùng miền thì độ trễ liên miền bằng 0). Có thể thấy với cách xác định độ trễ như vậy thì giá trị độ trễ ở đây là cố định, trong khi với mạng thực tế độ trễ là một giá trị biến đổi liên tục, ngoài ra mạng thực tế còn phức tạp hơn nhiều với cấu trúc đa tầng, tuy nhiên mô hình này cũng đã đủ đáp ứng mục đích mô phỏng độ trễ đa dạng giữa các nút có trong mạng.
Cấu trúc chương trình:
Chương trình bao gồm các lớp quan trọng sau:
Lớp Areas: gồm các đối tượng chứa thông tin về các miền có trong mạng mô phỏng, chứa các hàm truy xuất thông tin về miền, các hàm tính toán độ trễ liên miền.
Lớp Node: chứa thông tin về các nút có trong mạng. Một nút có các giá trị quan trọng như: tên, định danh, định danh miền chứa nó, độ trễ nội miền. Mỗi nút khi đưa vào mạng sẽ lưu thêm thông tin về các định danh của các nút successor, predecessor và bảng định tuyến. Bảng định tuyến (bảng finger) chứa thông tin về các finger của nút – là các đối tượng thuộc lớp FingerEntry.
Lớp Node ngoài các phương thức để thiết lập và truy xuất các thông tin kể trên còn một số phương thức quan trọng sau:
o fixFingerTable: thực hiện quá trình ổn định mạng bằng cách kiểm tra và chỉnh sửa lại tất cả các finger của nút.
o findSuccessor: đảm nhận việc tìm kiếm nút successor của một khóa cho trước. Phương thức trả lại giá trị là định danh của chính nút đó
nếu nó là successor của khóa, hoặc sẽ chuyển tiếp truy vấn cho một nút gần nhất sau khóa trong bảng định tuyến bằng cách tiếp tục gọi đệ quy phương thức findSuccessor trên nút đó.
Lớp FingerEntry gồm các đối tượng là các mục trong bảng định tuyến của mỗi nút. Mỗi nút chứa fingerTable là tập hợp các đối tượng FingerEntry tạo nên bảng định tuyến của nút đó.
Lớp Network: Là lớp chứa toàn bộ thông tin về mạng mô phỏng. Sau khi khởi tạo các đối tượng miền và nút được thêm vào đối tượng network để xây dựng mô hình mạng. Đối tượng này tiếp tục thực hiện tất cả các quá trình phân bố tài nguyên vào các nút, sinh ra các truy vấn và thực hiện các truy vấn này. Các phương thức quan trọng là:
o nodeBirth, nodeDeath o fixFingerTables
o getNodeDistance
Lớp InputGenerator: Là lớp đảm nhận việc sinh các dữ liệu cần thiết cho mạng hoạt động gồm thông tin về mạng, nút, vị trí của nút.
Lớp ResourceGen: Là lớp đảm nhận việc sinh tài nguyên và các truy vấn theo phân phối Zipf.
Lớp DoSchedule: Đảm nhận nhiệm vụ lên lịch và thực thi lần các thao tác của chương trình mô phỏng.
Quá trình thực thi:
Quá trình thực thi chương trình sẽ được phân ra làm nhiều bước và thực hiện tuần tự: đầu tiên là việc sinh ra các dữ liệu về mạng, tiếp đến là dữ liệu về tài nguyên và các truy vấn. Sau khi hoàn tất việc sinh các dữ liệu cần thiết, chương trình sẽ tiếp tục thực hiện các truy vấn, sau quá trình truy vấn các thông tin về mạng và kết quả thu được sẽ được tổng hợp và xuất ra file hoặc màn hình.
Quá trình sinh dữ liệu: Ban đầu một đối tượng Network được khởi tạo. Tiếp đó các thông tin về các đối tượng miền và nút được tạo ra từ các hằng số như số lượng miền, số lượng nút… Thời gian, thứ tự thực hiện truy vấn cũng như khả năng chịu tải của nút sẽ được sinh ngẫu nhiên bằng quá trình Poisson. Các thông số này được lưu lại thành file. Sau đó các đối tượng Areas và Node được sinh ra từ các file thông số đó. Sau khi tất cả các nút được sinh bằng cách gọi phương thức nodeBirth, bảng định tuyến của tất cả các nút được tính toán dựa vào phương thức fixFingerTables. Tiếp đến lớp ResourceGen được sử dụng để tạo số lượng các tài nguyên, cũng như danh sách truy vấn tương ứng.
Quá trình thực thi: Chương trình khởi tạo đối tượng thuộc lớp DoSchedule ứng với các thông số đã khởi tạo trước đó. Các thao tác thực hiện được đọc từ file schedule, bắt đầu bằng việc gán các tài nguyên vào từng nút, tiếp đến thực hiện các truy vấn từ file danh sách đã tạo ra trước đó. Quá trình thực hiện truy vấn theo đúng thiết kế của Chord thông qua hàm findSuccessor của lớp Node.
5.1.2. Các thay đổi đã áp dụng
Để cài đặt phương pháp điều khiển tắc nghẽn đã nêu, ta tiến hành một số thay đổi trên chương trình:
Cấu trúc chương trình: với lớp FingerEntry ta thêm biến lưu trữ thông tin về nút đích ban đầu.
Quá trình sinh dữ liệu: ngoài các dữ liệu ban đầu, ta sinh thêm một số dữ liệu như: giới hạn khả năng đáp ứng của các nút, thời gian thực hiện các truy vấn, thứ tự các nút thực hiện các truy vấn.
Quá trình thực thi: thay đổi chủ yếu được thực hiện trên lớp Node bao gồm các phương thức nhằm thực hiện:
o Phát hiện tắc nghẽn: trên mỗi nút duy trì một vector có kích thước bằng giới hạn khả năng đáp ứng của nút, chứa thời gian các truy vấn tới nút. Dựa vào vector này ta tính toán được tại thời điểm có một truy vấn tới nút đang trong tình trạng không tắc nghẽn, tắc nghẽn mềm hay tắc nghẽn hoàn toàn.
o Xử lý tắc nghẽn: Ta tạo ra phương thức tìm kiếm Successor cho một khóa mới. Nếu nút đang nhận truy vấn không bị tắc nghẽn việc thực hiện tương tự như phương thức findSuccessor ban đầu. Nếu nút xảy ra tắc nghẽn “mềm” sẽ tiến hành đặt lại fingerTable trên nút gửi truy vấn: chuyển tất cả các mục có đích là nút tắc nghẽn thành