Phân tải chương trình Erlang bằng node pool
Erlang
14
White

Ngoc Dao viết ngày 21/03/2016

Trong xử lí song song, các đơn vị thực hiện nhiệm vụ xử lí thường gặp là: thread, process, core, CPU, node. Thường mỗi node ứng với một server vật lí, có địa chỉ IP/hostname xác định. Các node được nối mạng với nhau.

Dùng Erlang thì chỉ cần quan tâm 2 đơn vị: process và node, những cái khác được Erlang tự động quản lí giúp. Thường ta có nhu cầu gom một số process lại thành process pool, hoặc một số node lại thành node pool. Bài viết này giới thiệu cách tạo node pool. Node pool có nhiều ứng dụng, hay gặp nhất là phân tải ra nhiều server.

Ta dùng module là pool để tạo node chính và slave để tạo node phụ. Các node phụ thường xuyên báo cho node chính về tải (load) mà nó đang chịu (hãy gõ lệnh uptime và top), dựa vào đây node chính tự động phân tải sao cho hợp lí nhất. Node chính ngoài nhiệm vụ quản lí các node phụ, cũng làm nhiệm vụ giống node phụ. Ví dụ có 1 node chính và 5 node phụ, thì công việc được chia đều cho 6 node.

Ta sẽ tạo chương trình tính giai thừa chạy phân tán trên nhiều node. Để đỡ phiền toái, ta có thể chỉ dùng một máy để chạy tất cả các node. Bạn đọc có thể tự chỉnh sửa để chạy trên nhiều máy.

Viết chương trình

-module(fac).

% node_fac must be exported for remote call to work
-export([start/2, stop/0, fac/1, node_fac/2]).

-define(TIMEOUT, 5000).

start(0, _) ->
ok;

start(NumNodes, Args) ->
% NodeName must not contain space
NodeName = list_to_atom("node" ++ integer_to_list(NumNodes)),
pool:start(NodeName, Args),
io:format("Started ~p~n", [NodeName]),
start(NumNodes - 1, Args).

stop() ->
pool:stop().

fac(N) ->
pool:pspawn(?MODULE, node_fac, [self(), N]),
receive
Result ->
Result
after ?TIMEOUT ->
timeout
end.

node_fac(From, N) ->
Result = real_fac(N),
From ! {node(), Result}.

real_fac(0) -> 1;
real_fac(N) -> N*real_fac(N - 1).

Giả sử chương trình được lưu thành tập tin /Users/ngocdt/tmp/erl/fac.erl và được biên dịch thành /Users/ngocdt/tmp/erl/fac.beam.

Cho phép rsh hoặc ssh không cần mật khẩu

Erlang phải tự động đăng nhập không cần mật khẩu vào [máy chứa] node phụ để chạy chương trình erl trên đó. Việc cấu hình rsh hoặc ssh để đăng nhập không cần mật khẩu nằm ngoài phạm vi bài viết này.

Ngoài ra, nên đặt lệnh erl ở thư mục "chuẩn", ví dụ /bin, để sau Erlang có thể chạy thành công lệnh erl ở node phụ sau khi đăng nhập. Hơn nữa, nếu dùng nhiều máy khác nhau, thì Erlang trên các máy này phải cùng phiên bản.

Sau khi cấu hình xong, tạo tập tin /Users/ngocdt/tmp/erl/.hosts.erlang chứa hostname của các node phụ, ví dụ:

'localhost'.

Chạy chương trình

Từ thư mục /Users/ngocdt/tmp/erl, gõ (nếu dùng RSH thì không cần tham số -rsh):

erl -sname foo -cookie bar -rsh ssh

Gõ để tạo pool:

fac:start(3, "-pa /Users/ngocdt/tmp/erl").

Nếu cấu hình đúng, sẽ thấy:

Started node3
Started node2
Started node1
ok

Để kiểm tra xem có đúng là có tổng cộng 4 node được tạo ra hay không, mở thêm console mới, gõ:

ps -A | grep beam | grep -v "grep beam"

Gõ để tạo process tính giai thừa:

fac:fac(3).

Sẽ thấy:

{node1@localhost,6}

Có nghĩa process vừa rồi được node chính yêu cầu node phụ node1 tạo ra rồi chạy. Gõ thêm vài lần nữa, sẽ thấy mỗi lần công việc được chạy trên các node khác nhau (kể cả node chính). Nếu bây giờ dùng vòng lặp để bắt node chính tính vài trăm cái giai thừa, thì nó sẽ phân bớt lại cho các node phụ để công việc được xử lí song song đồng thời.

Gõ để tắt các node phụ:

fac:stop().
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
283 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
62 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết hơn 2 năm trước
62 8
White
40 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
40 1
White
34 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
34 1
Bài viết liên quan
White
3 0
Chú thích: Bài này đăng lần đầu năm 2009 để chia sẻ kinh nghiệm, sau khi tác giả viết xong thư viện closed source để bán. Hiện tại năm 2016 đã có t...
Ngoc Dao viết hơn 2 năm trước
3 0
White
3 0
Khi xây dựng hệ thống server phân tán chạy song song trên nhiều node, ta thường gặp bài toán có pattern sau: Có 3 node, mỗi node chạy một process ...
Ngoc Dao viết hơn 2 năm trước
3 0
White
0 0
Viết lại thư viện đã có sẵn của ngôn ngữ khác ít khi nào là nhiệm vụ thú vị, nên thường có chiêu thức nối ngôn ngữ này với ngôn ngữ kia với những...
Ngoc Dao viết hơn 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
283 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!