Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: rcbandit в Mar 10, 2011, 16:58



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

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


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

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


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: bvbfan в Mar 10, 2011, 17:36
Тук ($2) и ползвай числа вместо стрингове така производителността ще бъде максимална.


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: rcbandit в Mar 10, 2011, 17:43
Ще използвам С за да направя демоните. Данните ще бъдат в JSON формат.
А каква производителност сте постигнали?


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: gat3way в Mar 10, 2011, 17:46
Къде се запаметяват на диска? Това което се праща по UDS-а се пази на диска? Как пък ти хрумна това :)


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: rcbandit в Mar 10, 2011, 18:18
За AF_UNIX става дума.
UNIX internal (file system sockets)


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: gat3way в Mar 10, 2011, 19:24
Точно...и какво отива на диска?

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


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: triel в Mar 10, 2011, 19:40
Проблема е че съобщенията които се предават се запаметяват в директория на HDD което очевидно не е добра идея при положение че се пращат хиляди съобщения на веднъж.

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


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: rcbandit в Mar 10, 2011, 22:46
Моя грешка.
Кажете какъв performance сте постигнали.


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

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


Титла: Re: Linux - Unix Domain Socket - RamDisk
Публикувано от: rcbandit в 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);
    }
}

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

поздрави