কেন আলবাইন ডকার চিত্রটি উবুন্টু চিত্রের চেয়ে 50% এর চেয়ে ধীর?


35

আমি লক্ষ্য করেছি যে আমার পাইথন অ্যাপ্লিকেশনটি উবুন্টুতে ডকার ছাড়াই চালানোর চেয়ে এটি চালানোর সময় খুব ধীর python:2-alpine3.6হয়। আমি দুটি ছোট বেঞ্চমার্ক কমান্ড নিয়ে এসেছি এবং দুটি অপারেটিং সিস্টেমের মধ্যে বিশাল পার্থক্য দেখা যায়, যখন আমি ওবুন্টু সার্ভারে চালাচ্ছি এবং যখন আমি ম্যাকের জন্য ডকার ব্যবহার করছি।

$ BENCHMARK="import timeit; print(timeit.timeit('import json; json.dumps(list(range(10000)))', number=5000))"
$ docker run python:2-alpine3.6 python -c $BENCHMARK
7.6094589233
$ docker run python:2-slim python -c $BENCHMARK
4.3410820961
$ docker run python:3-alpine3.6 python -c $BENCHMARK
7.0276606959
$ docker run python:3-slim python -c $BENCHMARK
5.6621271420

আমি নিম্নলিখিত 'বেঞ্চমার্ক' চেষ্টা করেছিলাম, যা পাইথন ব্যবহার করে না:

$ docker run -ti ubuntu bash
root@6b633e9197cc:/# time $(i=0; while (( i < 9999999 )); do (( i ++
)); done)

real    0m39.053s
user    0m39.050s
sys     0m0.000s
$ docker run -ti alpine sh
/ # apk add --no-cache bash > /dev/null
/ # bash
bash-4.3# time $(i=0; while (( i < 9999999 )); do (( i ++ )); done)

real    1m4.277s
user    1m4.290s
sys     0m0.000s

এই পার্থক্যের কারণ কী হতে পারে?


1
@ আবার দেখুন: লঞ্চ করা
ব্যাশের

উত্তর:


45

আমি ঠিক পাইথন 3 ব্যবহার করে আপনার মত একই মানদণ্ড চালিয়েছি:

$ docker run python:3-alpine3.6 python --version
Python 3.6.2
$ docker run python:3-slim python --version
Python 3.6.2

2 সেকেন্ডের বেশি পার্থক্য সৃষ্টি করে:

$ docker run python:3-slim python -c "$BENCHMARK"
3.6475560404360294
$ docker run python:3-alpine3.6 python -c "$BENCHMARK"
5.834922112524509

আল্পাইন মসল প্রকল্প ( আয়না ইউআরএল ) libcথেকে (বেস সিস্টেম লাইব্রেরি) আলাদা প্রয়োগকরণ ব্যবহার করছে । এই লাইব্রেরির মধ্যে অনেক পার্থক্য রয়েছে । ফলস্বরূপ, প্রতিটি গ্রন্থাগার নির্দিষ্ট ব্যবহারের ক্ষেত্রে আরও ভাল সম্পাদন করতে পারে।

উপরের এই কমান্ডগুলির মধ্যে একটি স্ট্রেসের পার্থক্য রয়েছে । আউটপুটটি 269 লাইন থেকে পৃথক হতে শুরু করে Of অবশ্যই মেমরিতে বিভিন্ন ঠিকানা রয়েছে তবে অন্যথায় এটি খুব মিল। বেশিরভাগ সময় স্পষ্টতই pythonকমান্ডটি শেষ হওয়ার অপেক্ষায় ব্যয় হয়।

straceউভয় পাত্রে ইনস্টল করার পরে , আমরা আরও আকর্ষণীয় ট্রেস পেতে পারি (আমি বেঞ্চমার্কে পুনরাবৃত্তির সংখ্যা হ্রাস করে 10)।

উদাহরণস্বরূপ, glibcনিম্নলিখিত পদ্ধতিতে লাইব্রেরিগুলি লোড করা হচ্ছে (লাইন 182):

openat(AT_FDCWD, "/usr/local/lib/python3.6", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 205 entries */, 32768)   = 6824
getdents(3, /* 0 entries */, 32768)     = 0

একই কোড musl:

open("/usr/local/lib/python3.6", O_RDONLY|O_DIRECTORY|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
getdents64(3, /* 62 entries */, 2048)   = 2040
getdents64(3, /* 61 entries */, 2048)   = 2024
getdents64(3, /* 60 entries */, 2048)   = 2032
getdents64(3, /* 22 entries */, 2048)   = 728
getdents64(3, /* 0 entries */, 2048)    = 0

আমি বলছি না এটি মূল পার্থক্য, তবে মূল গ্রন্থাগারে আই / ও অপারেশন সংখ্যা হ্রাস করা আরও ভাল পারফরম্যান্সে অবদান রাখতে পারে contribute ভিন্নতা থেকে আপনি দেখতে পাচ্ছেন যে খুব একই পাইথন কোডটি কার্যকর করা কিছুটা ভিন্ন ভিন্ন সিস্টেমের কল হতে পারে। লুপ পারফরম্যান্সকে অনুকূলকরণের ক্ষেত্রে সম্ভবত সবচেয়ে গুরুত্বপূর্ণটি করা যেতে পারে। পারফরম্যান্স ইস্যু মেমরি বরাদ্দ বা অন্য কোনও নির্দেশের কারণে হয়েছে কিনা তা বিচার করার পক্ষে আমি যথেষ্ট যোগ্য নই।

  • glibc 10 পুনরাবৃত্তি সহ:

    write(1, "0.032388824969530106\n", 210.032388824969530106)
    
  • musl 10 পুনরাবৃত্তি সহ:

    write(1, "0.035214247182011604\n", 210.035214247182011604)
    

musl0.0028254222124814987 সেকেন্ডের দ্বারা ধীর। পুনরাবৃত্তির সংখ্যার সাথে পার্থক্যটি বাড়ার সাথে সাথে আমি ধরে নেব যে পার্থক্যটি JSON অবজেক্টের মেমরি বরাদ্দে রয়েছে।

আমরা যদি কেবলমাত্র আমদানি করতে মানদণ্ডকে হ্রাস jsonকরি তবে লক্ষ্য করি পার্থক্যটি এত বিশাল নয়:

$ BENCHMARK="import timeit; print(timeit.timeit('import json;', number=5000))"
$ docker run python:3-slim python -c "$BENCHMARK"
0.03683806210756302
$ docker run python:3-alpine3.6 python -c "$BENCHMARK"
0.038280246779322624

পাইথন লাইব্রেরি লোড করা তুলনামূলক দেখায়। জেনারেট list()বড় পার্থক্য সৃষ্টি করে:

$ BENCHMARK="import timeit; print(timeit.timeit('list(range(10000))', number=5000))"
$ docker run python:3-slim python -c "$BENCHMARK"
0.5666235145181417
$ docker run python:3-alpine3.6 python -c "$BENCHMARK"
0.6885563563555479

স্পষ্টতই সর্বাধিক ব্যয়বহুল অপারেশন হ'ল এটি json.dumps()গ্রন্থাগারগুলির মধ্যে মেমরি বরাদ্দের পার্থক্যের দিকে নির্দেশ করতে পারে।

মাপদণ্ডের দিকে আবার তাকানো , muslমেমরি বরাদ্দে সত্যই কিছুটা ধীর:

                          musl  | glibc
-----------------------+--------+--------+
Tiny allocation & free |  0.005 | 0.002  |
-----------------------+--------+--------+
Big allocation & free  |  0.027 | 0.016  |
-----------------------+--------+--------+

আমি নিশ্চিত না যে "বড় বরাদ্দ" বলতে কী বোঝায়, তবে muslএটি প্রায় 2 × ধীর, যা আপনি যখন হাজার হাজার বা কয়েক মিলিয়ন বার এই ক্রিয়াকলাপগুলি পুনরাবৃত্তি করবেন তখন তা গুরুত্বপূর্ণ হয়ে উঠতে পারে।


12
মাত্র কয়েকটি সংশোধন। musl আলবাইন এর গ্লিবসি নিজস্ব প্রয়োগ নয় । 1 ম মসল্ট গ্লিব্যাকের একটি (পুনরায়) বাস্তবায়ন নয়, তবে পসিক্স স্ট্যান্ডার্ড প্রতি libc এর বিভিন্ন বাস্তবায়ন । ২ য় মাসল আলপাইন নিজস্ব জিনিস নয়, এটি একটি স্বতন্ত্র, সম্পর্কযুক্ত প্রকল্প এবং কেবল আলপাইনেই মসল ব্যবহৃত হয় না।
জাকুব জিরুতকা

প্রদত্ত যে ম্যাসল লিবিসি আরও উন্নততর মান ভিত্তিক * বলে মনে হচ্ছে, নতুন বাস্তবায়নের কথা উল্লেখ না করে কেন এই ক্ষেত্রে এগুলি গ্লাবিকে কম দক্ষ করে দেখা যাচ্ছে? * CF। wiki.musl-libc.org/functional-differences-from-glibc.html
বন

0.0028 সেকেন্ডের পার্থক্যটি কি পরিসংখ্যানগতভাবে তাৎপর্যপূর্ণ? আপেক্ষিক বিচ্যুতিটি কেবল 0.0013% এবং আপনি 10 টি নমুনা নিচ্ছেন। এই 10 রান (বা এমনকি সর্বোচ্চ-মিনিট পার্থক্য) এর জন্য (আনুমানিক) মানক বিচ্যুতি কী ছিল?
পিটার মর্টেনসেন

: বেঞ্চমার্ক ফলাফল আপনি কেরনিন ল্যাবস কোড পড়ুন উচিত সংক্রান্ত প্রশ্নের জন্য @PeterMortensen etalabs.net/libc-bench.html যেমন যদি malloc চাপ পরীক্ষা 100 কিলোবাইট বার পুনরাবৃত্তি করা হয়। ফলাফলগুলি কয়েকটি দিকের নাম দেওয়ার জন্য লাইব্রেরি সংস্করণ, জিসিসি সংস্করণ এবং সিপিইউ ব্যবহারের উপর খুব বেশি নির্ভরশীল হতে পারে।
টম্বার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.