উইন্ডোজে মাল্টিথ্রেডেড জাভা অ্যাপ্লিকেশনটির খুব কম সিপিইউ ব্যবহার


18

আমি এক শ্রেণীর সংখ্যাগত অপ্টিমাইজেশান সমস্যার সমাধানের জন্য জাভা অ্যাপ্লিকেশনটিতে কাজ করছি - বৃহত্তর স্তরের লিনিয়ার প্রোগ্রামিং সমস্যাগুলি আরও সুনির্দিষ্ট হতে। একটি একক সমস্যা ছোট ছোট subproblems মধ্যে বিভক্ত করা যেতে পারে যে সমান্তরাল সমাধান করতে পারে। যেহেতু সিপিইউ কোরগুলির চেয়ে বেশি সাব-প্রবলেম রয়েছে, তাই আমি একটি এক্সিকিউটর সার্ভিস ব্যবহার করি এবং প্রতিটি সাব-প্রব্লেমকে কলযোগ্য হিসাবে নির্ধারণ করি যা এক্সিকিউটর সার্ভিসে জমা দেওয়া হয়। একটি সাবপ্রব্লেম সমাধানের জন্য একটি দেশীয় গ্রন্থাগার কল করা প্রয়োজন - এই ক্ষেত্রে একটি লিনিয়ার প্রোগ্রামিং সলভার।

সমস্যা

আমি ইউনিক্সে এবং উইন্ডোজ সিস্টেমে ৪৪ টি শারীরিক কোর এবং ২৫g জি মেমরি পর্যন্ত অ্যাপ্লিকেশনটি চালাতে পারি, তবে উইন্ডোজে গণনার সময়গুলি লিনাক্সের চেয়ে বড় সমস্যার চেয়ে বড় আকারের ক্রম। উইন্ডোজ কেবলমাত্র যথেষ্ট পরিমাণে মেমরির প্রয়োজন হয় না, তবে সময়ের সাথে সাথে সিপিইউর ব্যবহার শুরুতে 25% থেকে কয়েক ঘন্টা পরে 5% এ নেমে আসে। উইন্ডোজটিতে টাস্ক ম্যানেজারের একটি স্ক্রিনশট এখানে রয়েছে:

টাস্ক ম্যানেজার সিপিইউ ব্যবহার

পর্যবেক্ষণ

  • সামগ্রিক সমস্যার বৃহত্তর উদাহরণগুলির সমাধানের সময়গুলি কয়েক ঘন্টা থেকে কয়েক দিনের মধ্যে থাকে এবং 32 গিগাবাইট পর্যন্ত মেমোরি (ইউনিক্সে) গ্রাস করে। সাব-প্রবলেমের জন্য সমাধানের সময়গুলি এমএস পরিসরের মধ্যে।
  • আমি এই সমস্যাটি ছোট সমস্যাগুলির মুখোমুখি হই না যা সমাধান করতে কয়েক মিনিট সময় নেয়।
  • লিনাক্স বাক্সের বাইরে উভয় সকেট ব্যবহার করে, অন্যদিকে উইন্ডোজ আমাকে বিআইওএস-তে স্পষ্টভাবে মেমরি ইন্টারলিভিং সক্রিয় করতে প্রয়োজন যাতে অ্যাপ্লিকেশন উভয় কোর ব্যবহার করে। আমি এটি না করুক কিনা তা সময়ের সাথে সাথে সামগ্রিক সিপিইউ ব্যবহারের অবনতির উপর কোনও প্রভাব ফেলবে না।
  • আমি যখন ভিজুয়ালভিএম-এর থ্রেডগুলিতে দেখি তখন সমস্ত পুলের থ্রেড চলছে, কোনওটি অপেক্ষায় নেই অন্যথায়।
  • ভিজুয়ালভিএম অনুসারে, 90% সিপিইউ সময় নেটিভ ফাংশন কলের জন্য ব্যয় হয় (একটি ছোট রৈখিক প্রোগ্রাম সমাধান করে)
  • অ্যাপ্লিকেশন প্রচুর পরিমাণে বস্তু তৈরি করে এবং ডে-রেফারেন্স দেয় না বিধায় আবর্জনা সংগ্রহ কোনও সমস্যা নয়। এছাড়াও, বেশিরভাগ স্মৃতিটি অফ-হিপ বরাদ্দ করা হয়েছে বলে মনে হয়। লিনাক্সে 4 জি হিপ যথেষ্ট এবং উইন্ডোজে 8 জি সবচেয়ে বড় উদাহরণ রয়েছে।

আমি কি চেষ্টা করেছি

  • সমস্ত প্রকারের জেভিএম আরগস, হাই এক্সএমএস, হাই মেটাস্পেস, ইউজনুমা পতাকা, অন্যান্য জিসি।
  • বিভিন্ন জেভিএম (হটস্পট 8, 9, 10, 11)।
  • বিভিন্ন লিনিয়ার প্রোগ্রামিং সলভারের বিভিন্ন নেটিভ গ্রন্থাগার (সিএলপি, এক্সপ্রেস, সিপ্লেক্স, গুরুবি)।

প্রশ্নাবলি

  • দেশীয় কলগুলি ভারী ব্যবহার করে এমন একটি বৃহত মাল্টি-থ্রেড জাভা অ্যাপ্লিকেশনটির লিনাক্স এবং উইন্ডোজের মধ্যে পারফরম্যান্সের পার্থক্যটি কী চালিত করে?
  • বাস্তবায়নে আমি এমন কিছু পরিবর্তন করতে পারি যা উইন্ডোজকে সহায়তা করবে উদাহরণস্বরূপ, আমি কি এমন এক এক্সিকিউটারসেবা ব্যবহার করা এড়ানো উচিত যা হাজার হাজার কলয়েবল প্রাপ্ত হয় এবং এর পরিবর্তে কী করা উচিত?

আপনি কি ForkJoinPoolপরিবর্তে চেষ্টা করেছেন ExecutorService? আপনার সমস্যা সিপিইউতে আবদ্ধ হলে 25% সিপিইউর ব্যবহার সত্যিই কম।
ক্যারল ডউবেকি

1
আপনার সমস্যা এমন কিছু মনে হচ্ছে যা সিপিইউকে 100% এ চাপিয়ে দেবে এবং এখনও আপনি 25% এ রয়েছেন। কিছু সমস্যার ForkJoinPoolজন্য ম্যানুয়াল শিডিউলিংয়ের চেয়ে বেশি দক্ষ।
ক্যারল ডউবেকি

2
হটস্পট সংস্করণে সাইকেল চালিয়ে আপনি কি নিশ্চিত করেছেন যে আপনি "সার্ভার" ব্যবহার করছেন, "ক্লায়েন্ট" সংস্করণটি নয়? লিনাক্সে আপনার সিপিইউ ব্যবহার কী? এছাড়াও, বেশ কয়েকটি দিনের উইন্ডোজ আপটাইম চিত্তাকর্ষক! আপনার রহস্য কি? : পি
এরিকসন

3
হয়তো ব্যবহার করার চেষ্টা করুন Xperf একটি জেনারেট করতে FlameGraph । এটি আপনাকে সিপিইউ কী করছে (কিছু আশা করি ব্যবহারকারী এবং কার্নেল মোড উভয়ই) দিচ্ছে তা অন্তর্দৃষ্টি দিতে পারে তবে উইন্ডোজে আমি কখনই এটি করিনি।
ক্যারল ডউবেকি

1
@ নীল, উভয় রান (ইউনিক্স / উইন) দেশীয় লাইব্রেরি কল করতে একই ইন্টারফেস ব্যবহার করে? আমি জিজ্ঞাসা করি, কারণ এটি দেখতে অন্যরকম লাগে। লাইক: জেনা জেনা, লিনাক্স জনি ব্যবহার করে।
এসআর

উত্তর:


2

উইন্ডোজ জন্য প্রক্রিয়া প্রতি থ্রেড সংখ্যা প্রক্রিয়া ঠিকানা স্থান দ্বারা সীমাবদ্ধ (এছাড়াও মার্ক রাশিনোভিচ দেখুন - উইন্ডোজ সীমাবদ্ধতা পুশিং: প্রক্রিয়া এবং থ্রেডস )। সীমাবদ্ধতার কাছাকাছি এলে পার্শ্ব প্রতিক্রিয়ার কারণ মনে করুন (প্রসঙ্গের সুইচগুলি ধীরে ধীরে কমিয়ে দেওয়া, খণ্ড খণ্ডন ...)। উইন্ডোজের জন্য আমি কাজের লোডকে প্রক্রিয়াগুলির সেটগুলিতে ভাগ করার চেষ্টা করব। অনুরূপ ইস্যুটির জন্য যা আমি কয়েক বছর আগে জাভা লাইব্রেরিটি আরও সুবিধাজনকভাবে করার জন্য প্রয়োগ করেছি (জাভা 8), আপনার যদি পছন্দ হয় তবে একবার দেখুন: একটি বাহ্যিক প্রক্রিয়াতে কাজগুলি লাইব্রেরি করার জন্য


এটি দেখতে খুব আকর্ষণীয়! আমি দুটো কারণে এই পর্যন্ত যেতে (এখনও) কিছুটা দ্বিধা বোধ করছি: ১) সকেটের মাধ্যমে অজানা পাঠানোর ক্ষেত্রে ক্রিয়াকলাপের ওভারহেড থাকবে; 2) যদি আমি সমস্ত কিছু সিরিয়ালাইজ করতে চাই তবে এতে কোনও কাজের সাথে যুক্ত সমস্ত নির্ভরতা অন্তর্ভুক্ত থাকে - কোডটি পুনরায় লেখার জন্য এটি কিছুটা কাজ হবে - তবুও দরকারী লিঙ্কের জন্য আপনাকে ধন্যবাদ।
নীল

আমি আপনার উদ্বেগগুলি সম্পূর্ণরূপে ভাগ করে নিচ্ছি এবং কোডটি নতুন করে ডিজাইন করা কিছু প্রচেষ্টা হবে। গ্রাফটি ট্র্যাভার করার সময় আপনার যখন নতুন উপ-প্রক্রিয়াতে কাজকে বিভক্ত করার সময় থ্রেড সংখ্যার জন্য একটি প্রান্তিক প্রবর্তন করতে হবে। ঠিকানা 2) জাভা মেমরি-ম্যাপযুক্ত ফাইল (java.nio.MappedByteBuffer) দেখুন, যাতে আপনি কার্যকরভাবে প্রক্রিয়াগুলির মধ্যে ডেটা ভাগ করতে পারেন, উদাহরণস্বরূপ আপনার গ্রাফ ডেটা। গডস্পিড :)
গেরি

0

উইন্ডোজগুলির মতো শব্দগুলি পেজফাইলে কিছু সময়ের জন্য অচ্ছুত হওয়ার পরে কিছু মেমরি ক্যাশ করছে এবং সিপিইউ কেন ডিস্কের গতিতে বাধা রয়েছে তা স্থির করে

আপনি এটি প্রক্রিয়া এক্সপ্লোরার দ্বারা যাচাই করতে পারেন এবং কত মেমরি ক্যাশে হয়েছে তা পরীক্ষা করতে পারেন


তুমি ভাবো? পর্যাপ্ত ফ্রি মেমরি রয়েছে। উইন্ডোজ অদলবদল শুরু করবে কেন? যাইহোক, ধন্যবাদ।
নীল

কমপক্ষে আমার ল্যাপটপের উইন্ডোজগুলি মাঝে মাঝে ন্যূনতম অ্যাপ্লিকেশনগুলি অদলবদল করে, এমনকি পর্যাপ্ত মেমরির সাথেও
ইহুদি

0

আমি মনে করি এই কার্যকারিতা পার্থক্যটি ওএস কীভাবে থ্রেডগুলি পরিচালনা করে due জেভিএম সমস্ত ওএস পার্থক্য লুকায়। সেখানে অনেক সাইট যেখানে আপনি এটি সম্পর্কে পড়তে পারেন, মত এই , উদাহরণস্বরূপ। তবে এর অর্থ এই নয় যে পার্থক্যটি অদৃশ্য হয়ে যায়।

আমি মনে করি আপনি জাভা 8+ জেভিএম এ চলেছেন। এই সত্যের কারণে, আমি আপনাকে স্ট্রিম এবং ক্রিয়ামূলক প্রোগ্রামিং বৈশিষ্ট্যগুলি ব্যবহার করার চেষ্টা করার পরামর্শ দিচ্ছি। যখন আপনার অনেকগুলি ছোট স্বাধীন সমস্যা থাকে এবং আপনি সহজেই ক্রমিক থেকে সমান্তরাল সম্পাদনের দিকে যেতে চান তখন কার্যকরী প্রোগ্রামিং খুব কার্যকর। সুসংবাদটি হ'ল আপনাকে কতগুলি থ্রেড পরিচালনা করতে হবে তা নির্ধারণ করার জন্য আপনাকে কোনও নীতি নির্ধারণ করতে হবে না (এক্সিকিউটার সার্ভিসের মতো)। উদাহরণস্বরূপ ( এখান থেকে নেওয়া ):

package com.mkyong.java8;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class ParallelExample4 {

    public static void main(String[] args) {

        long count = Stream.iterate(0, n -> n + 1)
                .limit(1_000_000)
                //.parallel()   with this 23s, without this 1m 10s
                .filter(ParallelExample4::isPrime)
                .peek(x -> System.out.format("%s\t", x))
                .count();

        System.out.println("\nTotal: " + count);

    }

    public static boolean isPrime(int number) {
        if (number <= 1) return false;
        return !IntStream.rangeClosed(2, number / 2).anyMatch(i -> number % i == 0);
    }

}

ফলাফল:

সাধারণ স্ট্রিমগুলির জন্য, এটি 1 মিনিট 10 সেকেন্ড সময় নেয়। সমান্তরাল স্ট্রিমগুলির জন্য, এটি 23 সেকেন্ড সময় নেয়। পিএস i7-7700, 16 জি র‌্যাম, উইন্ডোজ 10 দিয়ে পরীক্ষিত

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


আমি সফ্টওয়্যারটির অন্যান্য অংশগুলিতে স্ট্রিম ব্যবহার করি তবে এই ক্ষেত্রে কোনও গ্রাফ ট্র্যাভার করার সময় কাজগুলি তৈরি করা হয়। এই স্ট্রিমগুলি ব্যবহার করে কীভাবে মোড়ানো যায় তা আমি জানতাম না।
নীল

আপনি গ্রাফটি অতিক্রম করতে পারেন, একটি তালিকা তৈরি করতে পারেন এবং তারপরে স্ট্রিমগুলি ব্যবহার করতে পারেন?
xcesco

সমান্তরাল স্ট্রিমগুলি কেবল একটি ফোর্কজইনপুলের সিনট্যাকটিক চিনি। যে আমি চেষ্টা করেছি (উপরে ক্লিক করুন @ করোলডাউনবিস্কি মন্তব্য)।
নীল

0

আপনি কি দয়া করে সিস্টেমের পরিসংখ্যান পোস্ট করবেন? টাস্ক ম্যানেজারটি যদি কেবলমাত্র একমাত্র সরঞ্জাম উপলব্ধ থাকে তবে কিছু ক্লু সরবরাহ করার জন্য এটি যথেষ্ট ভাল। আপনার কাজগুলি আইও-র জন্য অপেক্ষা করছে কিনা তা সহজেই তা বলতে পারে - যা আপনি বর্ণনা করেছেন তার ভিত্তিতে অপরাধীর মতো মনে হচ্ছে। এটি নির্দিষ্ট মেমরি পরিচালনার সমস্যার কারণে হতে পারে, বা গ্রন্থাগারটি ডিস্কে কিছু অস্থায়ী ডেটা লিখতে পারে ইত্যাদি may

আপনি যখন সিপিইউর 25% ব্যবহারের কথা বলছেন, আপনি কি বোঝাতে চাইছেন যে কয়েকটি কোর একই সময়ে ব্যস্ত রয়েছেন? (এটি এমন হতে পারে যে সমস্ত কোর সময়ে সময়ে কাজ করে তবে একই সাথে নয়)) সিস্টেমটিতে প্রকৃতপক্ষে কতগুলি থ্রেড (বা প্রক্রিয়া) তৈরি করা হয়েছে তা আপনি পরীক্ষা করতে পারেন? সংখ্যাটি কি সর্বদা কোরের সংখ্যার চেয়ে বড় হয়?

যদি পর্যাপ্ত থ্রেড থাকে তবে তাদের মধ্যে অনেকেই কী অলস কিছুর জন্য অপেক্ষা করছেন? সত্য হলে, তারা কী অপেক্ষা করছে তা দেখতে আপনি বাধা দেওয়ার (বা কোনও ডিবাগার সংযুক্ত) চেষ্টা করতে পারেন।


আমি কার্যকর করার জন্য টাস্ক ম্যানেজারের একটি স্ক্রিনশট যুক্ত করেছি যা এই সমস্যার প্রতিনিধি is অ্যাপ্লিকেশন নিজেই যতগুলি থ্রেড তৈরি করে মেশিনে শারীরিক কোর রয়েছে। জাভা সেই চিত্রটিতে 50 টিরও বেশি থ্রেডের অবদান রাখে। যেমন ইতিমধ্যে বলা হয়েছে ভিজ্যুয়ালভিএম বলেছে যে সমস্ত থ্রেড ব্যস্ত (সবুজ)। তারা কেবল সিপিইউকে উইন্ডোজের সীমার দিকে ঠেলে দেয় না। তারা লিনাক্স উপর।
নীল

@ নীল আমার সন্দেহ হয় আপনার কাছে একই সময়ে সমস্ত থ্রেড ব্যস্ত থাকে না তবে বাস্তবে কেবল 9 - 10 টি। এগুলি সমস্ত কোর জুড়ে এলোমেলোভাবে নির্ধারিত হয়েছে, সুতরাং আপনার কাছে গড় 9/44 = 20% রয়েছে। পার্থক্যটি দেখতে আপনি কি এক্সিকিউটারসেবার চেয়ে সরাসরি জাভা থ্রেড ব্যবহার করতে পারেন? 44 টি থ্রেড তৈরি করা কঠিন নয় এবং প্রতিটি টাস্ক পুল / সারি থেকে চালনযোগ্য / কলযোগ্যকে ধরে নেওয়া bing (যদিও ভিজ্যুয়ালভিএম দেখায় সমস্ত জাভা থ্রেড ব্যস্ত রয়েছে, বাস্তবতাটি হতে পারে যে 44 থ্রেডগুলি দ্রুত নির্ধারিত হয়েছে যাতে সেগুলির সমস্ত ভিজুয়ালভিএমের স্যাম্পলিং পিরিয়ডে চালানোর সুযোগ পায়))
জিয়াও-ফেং লি

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