Автор Тема: Linux - Unix Domain Socket - RamDisk  (Прочетена 5642 пъти)

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Linux - Unix Domain Socket - RamDisk
« -: Mar 10, 2011, 16:58 »
Здравете,
    Работя в момента върху едно приложение което е разделено на няколко части - всеки на отделен демон. Мисля да използвам Linux IPC за да си обменят стрингове самите демони.
    Разгледах наличните методи за IPC и най-много ми хареса Unix Domain Socket. Изгрежда ми много удобен за моя случай. Проблема е че съобщенията които се предават се запаметяват в директория на HDD което очевидно не е добра идея при положение че се пращат хиляди съобщения на веднъж. Та сетих се че може да са използва малък RAMDISK като буфер за временно съхранение на данните.

Бихте ли споделили вашия опит с Linux IPC? Най-вече каква производителност сте постигнали и какви IPC сте ползвали.
Активен

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #1 -: Mar 10, 2011, 17:33 »
Здравете,
    Работя в момента върху едно приложение което е разделено на няколко части - всеки на отделен демон. Мисля да използвам Linux IPC за да си обменят стрингове самите демони.
    Разгледах наличните методи за IPC и най-много ми хареса Unix Domain Socket. Изгрежда ми много удобен за моя случай. Проблема е че съобщенията които се предават се запаметяват в директория на HDD което очевидно не е добра идея при положение че се пращат хиляди съобщения на веднъж. Та сетих се че може да са използва малък RAMDISK като буфер за временно съхранение на данните.

Бихте ли споделили вашия опит с Linux IPC? Най-вече каква производителност сте постигнали и какви IPC сте ползвали.
хвърли едно око на shared memory, messages. Ако позлваш java jmx е очевиден избор, да, иска повече работа, но може да е полезен за много неща
Активен

0x2B|~0x2B

bvbfan

  • Напреднали
  • *****
  • Публикации: 1056
  • Distribution: KaOS
  • Window Manager: Plasma 5
    • Профил
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #2 -: Mar 10, 2011, 17:36 »
Тук и ползвай числа вместо стрингове така производителността ще бъде максимална.
Активен

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #3 -: Mar 10, 2011, 17:43 »
Ще използвам С за да направя демоните. Данните ще бъдат в JSON формат.
А каква производителност сте постигнали?
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #4 -: Mar 10, 2011, 17:46 »
Къде се запаметяват на диска? Това което се праща по UDS-а се пази на диска? Как пък ти хрумна това :)
Активен

"Knowledge is power" - France is Bacon

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #5 -: Mar 10, 2011, 18:18 »
За AF_UNIX става дума.
UNIX internal (file system sockets)
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #6 -: Mar 10, 2011, 19:24 »
Точно...и какво отива на диска?

Съобщенията със сигурност не отиват.
Активен

"Knowledge is power" - France is Bacon

triel

  • Напреднали
  • *****
  • Публикации: 36
    • Профил
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #7 -: Mar 10, 2011, 19:40 »
Проблема е че съобщенията които се предават се запаметяват в директория на HDD което очевидно не е добра идея при положение че се пращат хиляди съобщения на веднъж.

Файловата система се използва за адресиране на socket-ите, но това в никакъв случай не означава, че съобщенията се предават/съхраняват на диска.
Активен

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #8 -: Mar 10, 2011, 22:46 »
Моя грешка.
Кажете какъв performance сте постигнали.
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #9 -: Mar 10, 2011, 23:25 »
Предполагам производителността е в пряка зависимост от мощността на процесора и от скоростта на достъп до паметта. По-бърз процесор означава по-бързи context switch-ванки, и тъй като между тях се чисти кеша, съдържанието на съобщенията се чете от рам-та. Така че дори някой да ти каже каква скорост е постигнал, това ще зависи доволно добре от тези фактори. Също така силно зависи от това по колко се праща наведнъж. Също така предполагам доста зависи от това дали е еднопроцесорна система или не. Процесът който праща, няма нужда да превключва контексти (влизането в kernel mode в линукс не включва превключване на контекства, става от същият контекст). Процесът който получава обаче чете от сокета и това е блокваща операция. Когато ядрото реши че има нещо пристигнало на сокета, асоциран с този процес, ще го събуди. Ако системата е еднопроцесорна/едноядрена, това означава че при всяко писане от единия процес, другият ще се слага в runqueue-а и ще се превключват евентуално контексти. Оттам по-горният въпрос за големината на съобщенията, ако се пращат много малки съобщения се очаква да има повече превключвания на контексти, съответно нещата ще стават по-бавно.

А иначе като цяло какво чак толкова пращаш че толкова държиш на производителността? Ако наистина много държиш на това, по-добре ползвай shared memory.
Активен

"Knowledge is power" - France is Bacon

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Linux - Unix Domain Socket - RamDisk
« Отговор #10 -: Mar 13, 2011, 18:18 »
Намерих един интересен пример за Unix domain socket - server

Код:
/*  Make the necessary includes and set up the variables.  */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_un server_address;
    struct sockaddr_un client_address;

/*  Remove any old socket and create an unnamed socket for the server.  */

    unlink("server_socket");
    server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

/*  Name the socket.  */

    server_address.sun_family = AF_UNIX;
    strcpy(server_address.sun_path, "server_socket");
    server_len = sizeof(server_address);
    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

/*  Create a connection queue and wait for clients.  */

    listen(server_sockfd, 5);
    while(1) {
        char ch;

        printf("server waiting\n");

/*  Accept a connection.  */

        client_len = sizeof(client_address);
        client_sockfd = accept(server_sockfd,
            (struct sockaddr *)&client_address, &client_len);

/*  We can now read/write to client on client_sockfd.  */

        read(client_sockfd, &ch, 1);
        ch++;
        write(client_sockfd, &ch, 1);
        close(client_sockfd);
    }
}

Как обаче може повече от един клиент да се свързват едновременно? С нишки ли? Бихте ли ми показали как ще стане примера с нишки?

поздрави
« Последна редакция: Mar 13, 2011, 18:22 от rcbandit »
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Winnt domain през linux vpn
Хардуерни и софтуерни проблеми
deid 1 3394 Последна публикация Mar 20, 2006, 16:30
от laskov
Linux join-at v domain win2003
Кошче
badore 0 3257 Последна публикация Jan 04, 2007, 11:55
от badore
Системни интегратори unix/linux
Търсене
pink 4 5560 Последна публикация Jun 22, 2007, 09:17
от pink
интересна статия на тема надеждност unix/linux/win
Коментар
dilyan 1 5384 Последна публикация Apr 18, 2008, 12:37
от gat3way
Файлова система - Разлики между UNIX и LINUX?
Коментар
niki22 3 4569 Последна публикация Nov 23, 2009, 14:06
от v_badev