দীর্ঘ "ক্লায়েন্ট প্রক্রিয়াকরণের সময়" এর কারণে, তবে স্থানীয়ভাবে দ্রুত রিমোট নির্বাচন নির্বাচন করুন


12

আমাদের প্রোডাকশন সার্ভারের সাথে সংযুক্ত থাকাকালীন (এসকিউএল সার্ভার ২০০৮, খুব শক্তিশালী মেশিন), এই নির্বাচনী বিবৃতিটি সমস্ত ক্ষেত্রের (মোট 4 এমবি ডেটা) পিছনে ছিটকে 2 সেকেন্ড সময় নেয় ।

SELECT TOP (30000) *
FROM person
WITH(NOLOCK);

একই নেটওয়ার্কের অন্য কোনও বাক্স থেকে (এসকিউএল প্রমাণীকরণ বা উইন্ডোজ প্রমাণীকরণ ব্যবহার করে সংযোগ স্থাপন করা), একই ক্যোয়ারীতে 1 মিনিট, 8 সেকেন্ড সময় লাগে ।

আমি এই খুব সরল বিবৃতি দিয়ে পরীক্ষা করছি যে এটি কোনও সূচী সমস্যা বা কোয়েরি-সম্পর্কিত সমস্যা নয়। (এই মুহূর্তে সমস্ত প্রশ্নের সাথে আমাদের পারফরম্যান্সের সমস্যা রয়েছে ...)

সারিগুলি খণ্ডগুলিতে আসে এবং সমস্ত একবারে হয় না। আমি আমার প্রথম সারিগুলি তাত্ক্ষণিকভাবে পেয়েছি এবং তারপরে সারিগুলির ব্যাচগুলি 1ুকতে 1 মিনিটেরও বেশি অপেক্ষা করে।

কোয়েরির ক্লায়েন্ট পরিসংখ্যান এখানে, যখন এটি দূরবর্তী বাক্স থেকে চালানো হয়:

Query Profile Statistics
  Number of INSERT, DELETE and UPDATE statements 0
  Rows affected by INSERT, DELETE, or UPDATE statements 0
  Number of SELECT statements  2
  Rows returned by SELECT statements 30001
  Number of transactions 0

Network Statistics
  Number of server roundtrips 3
  TDS packets sent from client        3
  TDS packets received from server 1216
  Bytes sent from client         266
  Bytes received from server 4019800

Time Statistics
  Client processing time 72441 ms (72 seconds)
  Total execution time   72441 ms
  Wait time on server replies 0

আমরা দেখতে পাচ্ছি যে "ক্লায়েন্ট প্রসেসিং সময়" মোট নির্বাহের সময়ের সমান।

সত্যিকারের ডেটা স্থানান্তর কেন দীর্ঘ সময় নিচ্ছে তা নির্ণয়ের জন্য আমি কী পদক্ষেপ নিতে পারি তা কি কেউ জানেন?

এমন কি কোনও এসকিউএল কনফিগারেশন প্যারামিটার রয়েছে যা মেশিনগুলির মধ্যে ডেটা স্থানান্তর গতি সীমিত বা সীমিত করে?


উপায় দ্বারা, আমরা ডিবি সার্ভার এবং অন্য বাক্সের মধ্যে একই আকারের (4 এমবি) ফাইলটি অনুলিপি করার চেষ্টা করেছি এবং এটি এক সেকেন্ড সময় নিয়েছে। সুতরাং নেটওয়ার্ক সমস্যা বলে মনে হচ্ছে না।
ফ্রান্টিকরক

ক্লায়েন্ট অ্যাপ্লিকেশন কি? শেষ ব্যবহারকারী-ওয়ার্কস্টেশনগুলিতে এসএসএমএস?
থমাস স্ট্রিংগার

হ্যাঁ মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও 10.50.1600.1। 2008 আর 2
ফ্র্যান্টিকরক

এই সমস্যাটি শুরু হয়েছে যেহেতু আমরা ডেটাসেন্টার স্থানান্তরিত করেছি এবং পুরো মেশিনটি পুনরায় ইনস্টল করা হয়েছে (এসকিউএল সহ সমস্ত কিছু)। আমরা খুব সম্মানজনক হোস্টিং সরবরাহকারীর সাথে আছি।
ফ্র্যান্টিক্রক

উত্তর:


5

আপনার সমস্যাটি অবশ্যই আপনার সম্পর্কিত তথ্যের ভিত্তিতে নেটওয়ার্ক সম্পর্কিত। এর মতো, নেটওয়ার্ক পেশাদারদের সাথে এটি মোকাবেলা করতে হবে (আমি এক নয়)।

যে জিনিসগুলি সাহায্য করতে পারে:

  • দ্রুত এনআইসি কার্ড (এসকিউএল সার্ভারে)।
  • সার্ভারগুলির মধ্যে ওয়েব / সার্ভার এবং এসকিউএল সার্ভারের মধ্যে বরাদ্দকৃত / নির্দিষ্ট এনআইসি কার্ড / সাবনেট যুক্ত করা।

ওয়েব-সার্ভারটি কি এসকিউএল সার্ভারের মতো একই সাব-নেটটিতে রয়েছে?

তাদের মধ্যে কি রাউটার / সেতু ইত্যাদি রয়েছে?

এসকিউএল সার্ভারে খুব বেশি সম্ভাব্য পরিবর্তন নেই:

  • মালিকানা এমএস "টিডিএস প্রোটোকল" সহ এসকিউএল সার্ভার আউটপুট ডেটা প্রেরণ করছে।
  • টিডিএস বাফারটির ডিফল্ট আকার 4 কেবি। এমএসডিবিতে দেখুন: "নেটওয়ার্ক প্যাকেটের আকার বিকল্প"
  • ডেটাটি সংকুচিত করা (এসকিউএল সার্ভার বা একটি বাহ্যিক অ্যাপ্লিকেশন সহ) - তথ্যের প্রকৃতির উপর নির্ভর করে।

আপনি একটি ডিফল্ট আকার ব্যবহার করছেন: আপনার পরিসংখ্যান দেখুন: "সার্ভার 1216 থেকে টিডিএস প্যাকেট প্রাপ্ত হয়েছে" (4 এমবি / 1 কে = 4 কেবি)। হ্যাঁ, টিডিএস বাফারটির আকার পরিবর্তন করা যেতে পারে: গুগলে দেখুন: "টিডিএস প্রোটোকল ব্যাচের আকার"

বিষয়টিতে ভাল আলোচনা: "এসকিএল এর নেটওয়ার্ক প্যাকেটের আকারটি কি সত্যিই রাউন্ড ট্রিপ ট্র্যাফিক নির্ধারণ করে?"

তবে, টিডিএস প্যাকেজ আকার পরিবর্তন করলে (অনিবার্যভাবে) অনাকাঙ্ক্ষিত প্রভাব পড়বে এবং কেবলমাত্র ব্যতিক্রমী ক্ষেত্রে উত্পাদনে ব্যবহার করা উচিত।

আর্কিটেকচার পরিবর্তন করা বা মিডিয়ায় ডেটা ক্যাশে প্রবর্তনও সহায়তা করবে।


8

এই সমস্যাটি এখন সমাধান করা হয়েছে।

এটি একটি নেটওয়ার্ক সমস্যা ছিল এবং এসকিউএল বাক্সটি 10 জিবি / এস এনআইসি কার্ডের পরিবর্তে 100 এমবি / এস এনআইসি কার্ড ব্যবহার করছে ...

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

সাহায্যের জন্য সবাইকে ধন্যবাদ।


আপনার ঠিক আমার একই সমস্যা আছে এবং আমি আমার এসকিউএল সার্ভারটি কোন এনআইসি কার্ড ব্যবহার করে তা যাচাই করতে চাই। আমি এটা কোথায় দেখতে পারি?
মিশা জাস্লাভস্কি

3

প্রাথমিক পড়াতে মনে হচ্ছে আপনি কিছু নেটওয়ার্কের বিলম্বিত সমস্যা ভোগ করছেন। আপনি নেটওয়ার্ক পারফোন কাউন্টার কিছু তাকান? এগুলি আপনাকে নেটওয়ার্কের সাথে কী চলছে তার কিছু ইঙ্গিত দিতে পারে।

পারফোন কাউন্টারগুলির কাছ থেকে উদ্ধৃতি আমার কী পর্যবেক্ষণ করা উচিত এবং তাদের প্রত্যেকটির অর্থ কী?

নেটওয়ার্ক IO

নেটওয়ার্ক I / O পরিমাপ করতে, আপনি নিম্নলিখিত কাউন্টারগুলি ব্যবহার করতে পারেন:

নেটওয়ার্ক ইন্টারফেসবাইটস মোট / সেকেন্ড

থ্রেশহোল্ড: নেটওয়ার্ক ব্যান্ডউইথের ৮০ শতাংশের বেশি স্থিত মান।

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

নেটওয়ার্ক ইন্টারফেসবাইটগুলি প্রাপ্ত / সেকেন্ড

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

নেটওয়ার্ক ইন্টারফেসবাইট প্রেরিত / সেকেন্ড

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

সার্ভারবাইটস মোট / সেকেন্ড

এই মানটি নেটওয়ার্ক সক্ষমতার 50 শতাংশের বেশি হওয়া উচিত নয়।

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

প্রসেসর% বিঘ্নিত সময়

এই কাউন্টারটি প্রসেসরের হার্ডওয়্যার বিঘ্নগুলি গ্রহণ ও সার্ভিসিংয়ে ব্যয় করার কত শতাংশ নির্দেশ করে। এই মানটি এমন ডিভাইসের ক্রিয়াকলাপের একটি অপ্রত্যক্ষ সূচক যা নেটওয়ার্ক অ্যাডাপ্টারগুলির মতো বিঘ্ন সৃষ্টি করে।

নেটওয়ার্ক ইন্টারফেস (*) আউটপুট কিউ দৈর্ঘ্য

নেটওয়ার্কের অ্যাডাপ্টারে কত থ্রেড অপেক্ষা করছে তা এই কাউন্টারটি পরীক্ষা করে। যদি নেটওয়ার্ক অ্যাডাপ্টারে প্রচুর থ্রেড অপেক্ষা করা থাকে, তবে সিস্টেমটি সম্ভবত নেটওয়ার্ক I / O নেটওয়ার্ক স্যাটারেটিং করছে সম্ভবত নেটওয়ার্ক ল্যাটেন্সি বা নেটওয়ার্ক ব্যান্ডউইথের কারণে।

আউটপুট সারি দৈর্ঘ্য আউটপুট প্যাকেট সারি (প্যাকেটগুলিতে) এর দৈর্ঘ্য। যদি এটি দু'জনের চেয়ে বেশি হয় তবে বিলম্ব হয় এবং যদি সম্ভব হয় তবে বাধা খুঁজে পাওয়া উচিত এবং এটিকে নির্মূল করা উচিত। যেহেতু এই বাস্তবায়নে নেটওয়ার্ক ড্রাইভার ইন্টারফেস স্পেসিফিকেশন (এনডিআইএস) দ্বারা অনুরোধগুলি সারিবদ্ধ, তাই এটি সর্বদা 0 হবে।


পারফরমনে এই পরিসংখ্যানগুলি পর্যবেক্ষণ করার পরে, আমি কয়েকটি জিনিস লক্ষ্য করেছি। মোট বাইটস / সেকেন্ড কোনও কোনও কার্ডে 700K / s এর বেশি হয় না। এমনকি যদি আমি এমন কোনও ক্যোয়ারী চালাচ্ছি যা মেগাবাইট ডেটার জন্য অনুরোধ করে, এই সংখ্যাটি প্রায় 500K / সেকেন্ডে থাকে। আমাদের ব্যান্ডউইথটি 100 এমবিপিএস, এবং আমরা এর 1% ব্যবহার পর্যন্ত পাচ্ছি না। আমি ভাবছি এমন কোনও সীমাবদ্ধতা কোথাও কনফিগার করা উচিত যা প্যাকেটের আকার জোর করে, বা স্থানান্তর হারকে সীমাবদ্ধ করে। হার্ডওয়্যার বিঘ্ন / সেকেন্ড 700-2000 এ রয়েছে। আউটপুট সারি খালি। নেটওয়ার্ক কার্ড ব্যবহার শীর্ষে প্রায় 4% শীর্ষে।
ফ্র্যান্টিক্রক

2
নেটওয়ার্ক কার্ডের গতি এবং স্যুইচ পোর্টের মধ্যে কোনও মিল নেই। আপনি কি নিজের নেটওয়ার্ক টিমটিকে স্যুইচ দিক থেকে এটি দেখার জন্য নিযুক্ত করেছেন?
jgardner04

2

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

একই নেটওয়ার্কের অন্য কোনও বাক্স থেকে ... একই ক্যোয়ারীতে 1 মিনিট, 8 সেকেন্ড সময় লাগে। 3) আপনি বলছেন যে ক্যোয়ারীটি ফিরে আসে এবং ক্লায়েন্টের কাছ থেকে গ্রহন করা হয়, প্রদত্ত নেটওয়ার্কের কোনও মেশিনে অবস্থিত (আপনার নির্দিষ্ট মেশিনটি ছাড়িয়ে যাবে) প্রায় 70 সেকেন্ডের মধ্যে? আমি ঠিক বুঝেছি? ৩.১ ঘটনাচক্রে এই কোয়েরিটি গ্রহণের সময়টি কী, ব্যবসায় দ্বারা গ্রহণযোগ্য? 4) তবে, আপনি নির্দিষ্ট ক্লায়েন্ট মেশিনের জন্য যেটি ক্যোয়ারী আউটপুট খরচ করার সময়টি ব্যবহার করছেন তা নির্দিষ্ট করে দিচ্ছেন: ক্লায়েন্ট কার্যকর করার সময় 15:30: 48 মিনিট? (এবং এই সময়টি স্পষ্টভাবে গ্রহণযোগ্য নয়)? সঠিক? )) সমস্যা কি একক ক্লায়েন্ট মেশিনের মধ্যে সীমাবদ্ধ? বা কোনও ক্লায়েন্ট / মিড-টায়ার ইত্যাদি মেশিনের (কোনও নতুন পরিবেশে)? )) পিং দিয়ে দেরি কী দেখায়? ক্লায়েন্ট কম্পিউটার থেকে সার্ভারে? )) আপনি (বা নেটওয়ার্ক অ্যাডমিন) উভয়ভাবে ট্রেসার্ট চালিয়েছেন (ক্লায়েন্ট থেকে সার্ভার, সার্ভার থেকে ক্লায়েন্ট)? কয়টি হপ? সম্মিলিত সময় কি? 8) পুরানো প্রোডাকশন নেটওয়ার্কটি কি জীবিত? আপনি কি পিং এবং ট্রেস্রোয়েট ব্যবহার করে তুলনা করতে পারেন - ক্লায়েন্ট এবং সার্ভারের মধ্যে সময় এবং হप्स কী ছিল?

কৌতূহলের বাইরে: এটি ক্যোয়ারির উদাহরণ? বা কোয়েরিটির হুবহু শব্দ? ক্যোয়ারিতে সত্যই যেখানে ক্লজ নেই? আমার সাথে একমত হোন যে এটি অত্যন্ত অস্বাভাবিক .. টেবিলটির একটি ক্লাস্টার্ড সূচক আছে বা একটি গাদা? টেবিলটিতে মোট কতগুলি সারি রয়েছে? টেবিল ভারী খণ্ডিত হয়? কৌতূহলের বাইরে: কেন শীর্ষ এনএনএন নির্বাচন করবেন? কেন ROWCOUNT NNN সেট করবেন না - তারপরে নির্বাচন করুন? এই ক্যোয়ারী ক্লায়েন্ট দ্বারা প্রতিদিন কতবার জারি করা হয়? 1? 100? 1MLN? অন্তর্নিহিত ডেটা স্থিতিশীল বা গতিশীল এবং অনেক পরিবর্তন হয়েছে? কত (প্রতিদিন 0.01 শতাংশ? 1 শতাংশ প্রতিদিন? 10 শতাংশ? (কোনও ব্যবহারকারীর দ্বারা নয়?) কেন এটি মাঝারি স্তরে ক্যাশেড / সংরক্ষণ করা হয় না? ধন্যবাদ, আলেক্সি


তথ্যের জন্য অনেক ধন্যবাদ. আমার প্রতিক্রিয়া নীচে। 1. সঠিক। ক্লায়েন্ট সরঞ্জামগুলিও প্রোডে ইনস্টল করা হয়, এবং আমি একই উল্লিখিত ক্যোয়ারী 30,000 রেকর্ড (মোট 4 এমবি আকার) সমস্ত ফিরিয়ে দিতে 2 সেকেন্ড সময় নেয়। যাইহোক, আমার ব্যবহৃত ক্যোয়ারীটি কেবল একটি উদাহরণ an এটি একটি আসল ব্যবসায়ের ক্যোয়ারী নয়। এটি একটি টেবিল থেকে 4 এমবি ডেটা পাওয়ার উপায় মাত্র। বর্তমানে আমাদের যে কোনও প্রশ্নের সাথে কোনও টেবিল থেকে বেশ কয়েকটি মেগাবাইট ডেটা পড়ার পারফরম্যান্সে সমস্যা রয়েছে।
ফ্র্যান্ট্রাকক 1'12 12 এ 14

২. ব্যবহারের সময়টি খুব কাছাকাছি ছিল, যদি একই ক্যোয়ারির মতো না হয় তবে স্থানীয়ভাবে পিআরডি বাক্স থেকে চলে। (IE 2 সেকেন্ড) 3. এটি কার্যকর সময় 1 মিনিট 8 সেকেন্ড। এই সময় বিভিন্ন ক্লায়েন্ট মেশিনের মধ্যে পরিবর্তিত হয়। আমাদের ডেভলপমেন্ট মেশিন থেকে (স্টেজ মেশিনের থেকে অনেক দূরে অবস্থিত), আমি এই প্রশ্নটি একটানা 8 বার চালিয়েছি এবং সময়টি 11 সেকেন্ড থেকে 22 সেকেন্ড পর্যন্ত ছিল। (গড় 18 সেকেন্ড।)
ফ্র্যান্টিকরক 1'12 12 এ 14

আমাদের ডেভ বক্স ট্রেসার্ট থেকে প্রোডিআইপি_এড্রেস 1 53 এমএস 52 এমএস 53 এমএস এসকিউএল 20038 স্টেজ মেশিন থেকে, সময়টি ধারাবাহিকভাবে 1 মিনিটের বেশি হয়। ট্রেসার্ট Prod_IP_Adress ঠিকানা: 1 1 এমএস <1 এমএস <1 এমএস এসকিউএল ২০০8 উত্পাদন ওয়েব সার্ভার থেকে: মৃত্যুর সময় 53 সেকেন্ড। ট্রেসার্ট: 1 1 এমএস <1 এমএস <1 এমএস এসকিউএল ২০০8
ফ্র্যান্টিকরক

৪. শীর্ষস্থানীয় কলাম "ক্লায়েন্ট এক্সিকিউশন টাইম" মেশিনের স্থানীয় সময় মাত্র (IE: 15:30:00) ৫. সমস্যাটি যে কোনও মেশিনে প্রোডাকশন ডিবি সার্ভারকে আঘাত করে, আমাদের প্রোডাকশন ওয়েব সার্ভার সহ। The. পিং বিলম্ব হ'ল স্টেজ বক্স থেকে প্রো এসকিউএল বাক্সে <1 এমএস। Please. উপরে দেখুন দয়া করে। ৮. দুর্ভাগ্যক্রমে পুরাতন নেটওয়ার্ক আর বিদ্যমান নেই।
ফ্র্যান্ট্রোক

এটি সত্যিই আকর্ষণীয় যে যদিও ডিইভি 53 এমএস পিং করে, কোয়েরিটি চালাতে কেবল 11-22 সেকেন্ড সময় নেয়। যদিও, পর্যায়টি 1 এমএস পিং করে ডেটা ফেরত নিতে 1 মিনিটের বেশি সময় নেয়। ভৌগোলিক দিক থেকে দেব আরও অনেক দূরে। এবং মঞ্চটি প্রোড বক্সের ঠিক পাশেই রয়েছে এবং এখনও অনেক বেশি সময় নিচ্ছে।
ফ্র্যান্টিক্রক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.