ফাইল আইওর চেয়ে সিসলগ এত ধীর কেন?


9

সিসলগ ফাংশনের কর্মক্ষমতা পরিমাপ করার জন্য আমি একটি সাধারণ পরীক্ষা প্রোগ্রাম লিখেছিলাম। এটি আমার পরীক্ষার সিস্টেমের ফলাফল: (লিনাক্স 2.6.32-5-amd64 সহ ডেবিয়ান 6.0.2)

পরীক্ষার কেস পেওলড সময়কাল চিন্তা করে কল করে 
                      [] [এমবি] [গুলি] [এমবি / গুলি]    
-------------------- ---------- ---------- ---------- ----------
syslog 200000 10.00 7.81 1.28      
syslog% s 200000 10.00 9.94 1.01      
লিখুন / দেব / নাল 200000 10.00 0.03 343.93    
printf% s 200000 10.00 0.13 76.29     

প্রতিটি প্রোগ্রামের সময় পরীক্ষা প্রোগ্রাম 200000 সিস্টেম কল করে 50 বাইট ডেটা লিখেছিল।

ফাইল আইওর চেয়ে সিসলগ কেন দশগুণ বেশি ধীর?

এই পরীক্ষাটি আমি পরীক্ষার জন্য ব্যবহার করেছিলাম:

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <syslog.h>
#include <unistd.h>

const int  iter  = 200000;
const char msg[] = "123456789 123456789 123456789 123456789 123456789";

struct timeval t0;
struct timeval t1;

void start ()
{
    gettimeofday (&t0, (void*)0);
}

void stop ()
{
    gettimeofday (&t1, (void*)0);
}

void report (char *action)
{
    double dt = (double)t1.tv_sec - (double)t0.tv_sec +
        1e-6 * ((double)t1.tv_usec - (double)t0.tv_usec);
    double mb = 1e-6 * sizeof (msg) * iter;

    if (action == NULL)
        printf ("Test Case             Calls       Payload     Duration    Thoughput \n"
                "                      []          [MB]        [s]         [MB/s]    \n"
                "--------------------  ----------  ----------  ----------  ----------\n");
    else {
        if (strlen (action) > 20) action[20] = 0;
        printf ("%-20s  %-10d  %-10.2f  %-10.2f  %-10.2f\n",
                action, iter, mb, dt, mb / dt);
    }
}

void test_syslog ()
{
    int i;

    openlog ("test_syslog", LOG_PID | LOG_NDELAY, LOG_LOCAL0);
    start ();
    for (i = 0; i < iter; i++)
        syslog (LOG_DEBUG, msg);
    stop ();
    closelog ();
    report ("syslog");
}

void test_syslog_format ()
{
    int i;

    openlog ("test_syslog", LOG_PID | LOG_NDELAY, LOG_LOCAL0);
    start ();
    for (i = 0; i < iter; i++)
        syslog (LOG_DEBUG, "%s", msg);
    stop ();
    closelog ();
    report ("syslog %s");
}

void test_write_devnull ()
{
    int i, fd;

    fd = open ("/dev/null", O_WRONLY);
    start ();
    for (i = 0; i < iter; i++)
        write (fd, msg, sizeof(msg));
    stop ();
    close (fd);
    report ("write /dev/null");
}

void test_printf ()
{
    int i;
    FILE *fp;

    fp = fopen ("/tmp/test_printf", "w");
    start ();
    for (i = 0; i < iter; i++)
        fprintf (fp, "%s", msg);
    stop ();
    fclose (fp);
    report ("printf %s");
}

int main (int argc, char **argv)
{
    report (NULL);
    test_syslog ();
    test_syslog_format ();
    test_write_devnull ();
    test_printf ();
}

সম্ভবত, সিসলগ কলগুলি আরও জটিল, একটি "বার্তা এবং প্রতিক্রিয়া" প্রক্রিয়া সহ, অনেক বেশি ওভারহেড থাকে, একাধিক ব্যবহারকারী-স্পেস প্রক্রিয়াগুলির মধ্যে ভ্রমণ (কোনও ডিভাইস বা কনসোলে লিখিত হওয়ার বিপরীতে) থাকে এবং বার্তাটি সফলভাবে না হওয়া পর্যন্ত ফিরে আসবে না স্বীকার করা হয়েছে।
আফরাজায়

1
রিচার্ডের উত্তর অনুসারে, আপনি যদি fprintf () এর পরে fflush (fp) যোগ করেন তবে সংখ্যাগুলি কি একই রকম দেখাচ্ছে?
sep332

@ sep3332 ফাংশনটিতে O_SYNCপতাকা যুক্ত করার পরে open()এবং fflush(fp)প্রতিটি fprintf()কল করার পরে , ফলাফলগুলি [3.86, 3.63, 151.53, 23.00] MB/sআমার কম্পিউটারে পরিণত হয় (লেনোভো টি 61, দেবিয়ান পরীক্ষা)) এটি এখন আরও ভাল মনে হচ্ছে তবে, দেখুন /etc/rsyslog.conf, এটি ইতিমধ্যে সিসলোগসের জন্য নন-সিঙ্ক মোডে রয়েছে।
Xiè Jìléi

উত্তর:


11

সিসলগ উভয়ই কল প্রতি এক AF_UNIX সকেটে এক প্রেরণ () ইস্যু করে। এমনকি যদি সিসলোগড ডেটা বাতিল করে দেয় তবে এটি প্রথমে এটি পড়তে হবে। এই সব সময় লাগে।

/ Dev / নালকে লেখাগুলি কল প্রতি এক লেখার ()ও জারি করে থাকে তবে যেহেতু ডেটা ফেলে দেওয়া হয় এটি কার্নেল দ্বারা খুব দ্রুত প্রক্রিয়া করা যায়।

এফপ্রিন্টফ () কলগুলি স্থানান্তরিত হয় প্রতি 4096 বাইটের জন্য কেবল একটি লিখন () জেনারেট করে, অর্থাত্ প্রতি আশি প্রিন্টফ কলগুলির মধ্যে একটি করে। প্রত্যেকটিতে কেবল libc এর বাফার থেকে কার্নেলের বাফারে ডেটা স্থানান্তর করা হয়। ডিস্কের প্রতিশ্রুতিবদ্ধতা খুব কম হবে (কমপক্ষে তুলনায়) খুব ধীরে হলেও কোনও সুস্পষ্ট সিঙ্ক্রোনাইজেশন কলের অভাবে পরে ঘটতে পারে (সম্ভবত প্রক্রিয়াটি শেষ হওয়ার পরেও)।

সংক্ষেপে: সিসলগটি / ডেভ / নলের চেয়ে ধীর কারণ এটি বাফারিংয়ের কারণে ফাইলটিতে প্রিন্টফের চেয়ে অনেক বেশি কাজ করে এবং প্রিন্টফের চেয়ে ধীর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.