* copyright (C) 1984-2019 merrill consultants dallas texas usa



Yüklə 28,67 Mb.
səhifə234/383
tarix17.01.2019
ölçüsü28,67 Mb.
#98988
1   ...   230   231   232   233   234   235   236   237   ...   383

MXG Dataset TYP120CI.
And IBM APAR OW44456 requires the following doc changes:

Periodically, IBM refreshes documentation on our Web

site, so the changes might have been made before you

read this text. To access the latest on-line

documentation, go to the product library page at:

www.ibm.com/software/webservers/appserv/library_390.html

And support provides a new edition:

Document Name: WebSphere Application Server Enterprise

Edition for OS/390 Operations and Administration

Document Number: GA22-7328-01

The new edition contains a chapter (Chapter 9) that

explains how to set up and use the new SMF recording

support and an appendix (Appendix A) that describes

the new SMF record type 120.

To get the new edition, go to our Web site at:

www.ibm.com/software/webservers/appserv/library_390.html

IBM support also requires changes to existing doc:

Document Name: WebSphere Application Server Enterprise

Edition for OS/390 Component Broker Planning and

Installation Guide

Document Number: GA22-7325-00

See revisions in the APAR OW44456 text.

This support has not been tested with 120 SMF records.
Change 18.298 Support for the z/OS License Manager's new LPAR capacity

VMXGRMFI measurement: "Four-Hour Running Average MSU", with MSU in

TRNDRMFI "Million Service Units per Hour", based on the raw SU_SEC

Dec 12, 2000 of the physical platform. New MXG variable MSU4HRAV is

Dec 18, 2000 now created in the PDB.RMFINTRV dataset, and it is that

Feb 10, 2001 value that z/OS will pass to the License Manager, which

is compared with the licensed MSU for that LPAR (which

you chose in your software License Certificate for that

LPAR). WLM measures the MSU consumed by the LPAR every

five (may be changed) minutes, and if the licensed MSU is

exceeded, WLM will cap the LPAR to that licensed MSU for

the next interval.


So this new License Manager can save you lots on software

license costs, if you don't need an entire machine for an

LPAR; you can even license only part of an engine.
BUT to save that money, you will need to know your peak

MSU4HRAV for the month, in advance, so you can purchase a

correct size license, and you will need to track when

that peak MSU4HRAV consumption occurs, perhaps so you can

time-shift work to reduce that peak MSU consumed. Since

each month's charge is likely to be based on the maximum

peak running average during each calendar month, tracking

closely at near-month-end may be needed!


When WLM capping is invoked (because the LPAR exceeded

its licensed MSU4HRAV), response times may be elongated,

and it remains to be seen what feedback will be available

to alert you that dynamic capping was applied, but with

this new variable now, you can at least estimate the size

of each of your Systems to see how you will be able to

take advantage of License Manager product pricing.
The MSU4HRAV variable is created in PDB.RMFINTRV when

you run BUILDPDB/BUILDPD3, or if you run RMFINTRV or

invoke %VMXGRMFI in your own program. The algorithm

also creates the new SPIN.SPINRMFI dataset, which holds

the last four hours of the previous day, and is read by

the next day's BUILDPDB so that continuous four-hour

means are calculated. Variable CECSUSEC, the SU_SEC of

the physical CEC, is also created in PDB.RMFINTRV.


New variable MSU4HRMX in TRNDRMFI is the maximum value

of the MSU4HRAV during each trended interval.


You can add the new variables MSU4HRAV and CECSUSEC to

existing PDB.RMFINTRV datasets (without re-reading the

SMF data), by using the PDB=ADDMSU option in %VMXGRMFI to

read each existing PDB.RMFINTRV dataset and write back a

replacement, enhanced PDB.RMFINTRV dataset, as shown:

//PDB DD DSN=YOUR.EXISTING.PDB,DISP=OLD

//SYSIN DD *

%VMXGRMFI(PDB=ADDMSU);

If you add a //SPIN DD to that example, and start your

re-creation from the oldest to the newest, MSU4HRAV

will exist in all observations (except for the first

four hours of the oldest PDB):

//WEEKOLD EXEC MXGSAS

//PDB DD DSN=YOUR.WEEKOLD.PDB,DISP=OLD

//SPIN DD DSN=YOUR.SPIN,DISP=OLD

//SYSIN DD *

%VMXGRMFI(PDB=ADDMSU);

... one step per week ...

//WEEKNEW EXEC MXGSAS

//PDB DD DSN=YOUR.WEEKNEW.PDB,DISP=OLD

//SPIN DD DSN=YOUR.SPIN,DISP=OLD

//SYSIN DD *

%VMXGRMFI(PDB=ADDMSU);

If you use the first example, without SPIN, the first

four hour's observations in each output PDB.RMFINTRV

dataset will have missing value for the new variables.

Definitions and description of the algorithm:
"MSU" is Millions of Service Units per Hour, and it is

calculated from the raw (un-weighted) Service Unit Per

Second value (MXG's SU_SEC variable from TYPE72). The

equation to calculate the hourly MSU capacity is:


MSU= 3600*SU_SEC*NRCPUS/1000000 = 336 MSU (per hr)
(e.g.: 10 engine, SU_SEC=9334.8828, a z900 2064-110)
- But SU_SEC value in PDB.RMFINTRV and TYPE72 data is an

LPAR value, and is based on the number of CPU engines

that you gave to that LPAR for this system; increasing

the number of engines decreases the SU_SEC value, due

to the Multi-Processor effect that causes the recorded

CPU time to increase with the number of engines:

Spin loops for access to serialized storage is seen

as CPU time, and the recorded CPU time increases as

the number of engines increases, so to get constant

Service Units, we must multiply by a smaller factor.

An example of the 9021-711 family's MP Factors

CPUs 1 2 3 4 5 6 7 8 9 10

Pct: 100 95 92 88 85 81 79 77 75 72

So instead of using the SU_SEC value for each LPAR,

which varies with the number of engines in each LPAR,

the MSU capacity measurement in z/OS is based on the

new CECSUSEC variable, which is the SU_SEC for all

engines, the "SU_SEC" of the physical "box" or "CEC"

CEC, was Central Electronics Complex,

CPC, now Central Processing Complex,

and CECSUSEC is constant from LPAR to LPAR in a box.
CECSUSEC did not exist in the RMF records, and it has now

been added in z/OS as SMF70CPA, but MXG creates it now so

we can calculate MSU capacity even before you're at z/OS.
a. The original (18.11) algorithm to calculate CECSUSEC

and MSU from pre-z/OS records (replaced, below):


In OS/390 RMF TYPE72 records, we only have the SU_SEC

of this LPAR, but we could calculate the CECSUSEC from

the LPAR SU_SEC and the "table of MP factors",

above, given the engines in the LPAR and in the box:


CECSUSEC=SU_SEC*MP(PARTNCPU)/MP(NRCPUS);
where

MP(n) is the MP factor for n engines, above, and

PARTNCPU=engines in the physical CEC, and

NRCPUS =engines in this LPAR.


A numerical example:

An LPAR with an SU_SEC = 1000

with NRCPU = 2 (2 engines for this LPAR), and

on a 6-way CEC (PARTNCPU=6) would have a

CECSUSEC = 1000 *(81)/(95) = CECSUSEC = 852

At 100% busy that 2-CPU LPAR has MSU capacity of:

MSU = 3600sec*852SU_sec*2engines/1000000=6.1 MSU
b. The present (18.18) algorithm to get IBM MSU capacity

(pre-z/OS) using table lookup of IBM published values:


The original code worked fine for that one set of MP

factors, but the factors vary with CPU families, and

IBM does not publish a table of MP factors; instead

IBM publishs the MSU capacity of each CPU, and with

the help of Alan Sherkow, the new $MG070CP format is

created as a look-up table that returns the capacity

in MSU and the CECSUSEC, given the CPUTYPE, CPUVERSN,

and (for 2064's) the CPCMODEL.


Alan also noted that the MSU capacity calculated from

CECSUSEC does not exactly match IBM's MSU table value,

even though we thought it should; differences of up to

10% were observed on some particular machines.


c. When you're running under z/OS with License Manager,

the needed fields are added by IBM to the type 70 RMF

record and are kept in PDB.RMFINTRV dataset:

MXG Variable z/OS Variable Description

CECSUSEC SMF70CPA SU_SEC of n-way CPC

MSU4HRAV SMF70LAC 4-hour Average MSU

MSUINTRV n/a Interval MSU count

temp SMF70WLA Defined MSU Capacity


While IBM will provide the SMF70LAC field in z/OS, MXG

now calculates MSU4HRAV from RMF Interval records, going

back four hours, and uses the actual interval durations

so it supports different interval sizes. The last four

hours of each system is written out to SPIN.SPINRMFI so

they can be re-introduced tomorrow so that the four-hour

is continuous in RMFINTRV. (If you're using ADDMSU with

a large PDB.RMFINTRV, default array sizes of 9999 permit

three month's worth of 15 minute intervals.)
This is new territory, and we'll know a lot more about

MSU4HRAV when the License Manager product is released,

but at least now you can begin to measure your LPARs in

these IBM units that will certainly be important in the

future of capacity measurement.
Please do not confuse the License Manager measurements

with Usage Based Pricing, because they are not related.

Under the License Manager, it will be the size of the

LPAR that you define that sets the price you pay for

Software that runs in that LPAR, and it is the total

work in that LPAR (and not the usage of any software

product) that is measured and compared with the LPARs

defined capacity in MSU. There is no measurement of

product's software usage under License Manager, and it

is all work in the LPAR that will be capped if the

MSU4HRAV/SMF70LAC exceeds the SMF70WLA capacity.
Change 18.297 Cosmetic. The test IF NUMTRANS GT 0 for the calculation

ASUMCICX of SQRTARG is redundant so it was removed.

Dec 8, 2000

Thanks to Ian Mackay, Royal Bank of Scotland, SCOTLAND.


Change 18.296 Variable SYSTEM and CPUTM are kept/summed respectively

ASUMCICS from input CICSTRAN/MONITASK data into the PDB.CICS

Dec 8, 2000 summary dataset. CPUTM=TASCPUTM+CPURLSTM in CICSTRAN.

Thanks to Aubrey Tang, Westpac Banking Corporation, AUSTRALIA.


Change 18.295 Support for APAR OWxxxxx which adds a flag bit to type 79

VMAC79 subtype 2.

Dec 8, 2000
Change 18.294 QBGLGG now decoded and kept, although the counters in the

VMACDB2 QBGL section are suspect and under investigation.

Dec 7, 2000

Thanks to Don Deese, (CPExpert), Computer Management Sciences, USA.


Change 18.293 SPINCNT=SPINCNT+1; changed to SPINCNT=SUM(SPINCNT,1); so

IMACUOW that SPINCNT would actually be retained and incremented

Dec 7, 2000 and the SPIN library actually used.
Change 18.292A Support for MQ Series V5.2 SMF 115/116.

EXTY1152 -INCOMPATIBLE because subtype is now a two-byte binary at

EXTY1161 @19, having been corrected by IBM from the non-standard

EXTY116Q one-byte @19 (and that VMACSMF had catered for, and now

FORMATS had to be revised to cover both old and new 115/116 SMF).

VMAC115 -Reading new records with old MXG versions will create

VMAC116 zero observations from the new records.

VMACSMF -Type 115 Subtype 1, dataset MQMLOG has 7 new variables:

VMXGINIT QJSTBPAG QJSTCIWR QJSTLLCP QJSTLOGW QJSTLSUS QJSTSERW

Dec 8, 2000 QJSTTHRW

Dec 18, 2000 -Type 115 Subtype 2, new Q5ST DB2 manager statistics adds

70 new variables to existing dataset MQMMSGDM:

ABNDCNT ACTTASK CONNCNT DEADCNT DELECNT DELESCUW

DELESMXW DELETCUW DELETMXW DHIGMAX DISCCNT LISTCNT

LISTSCUW LISTSMXW LISTTCUW LISTTMXW NUMTASK READCNT

READSCUW READSMXW READTCUW READTMXW REQUCNT SCSBFTS

SCSDEL SCSDSCUW SCSDSMXW SCSDTCUW SCSDTMXW SCSINS

SCSISCUW SCSISMXW SCSITCUW SCSITMXW SCSMAXR SCSSEL

SCSSSCUW SCSSSMXW SCSSTCUW SCSSTMXW SCSUPD SCSUSCUW

SCSUSMXW SCSUTCUW SCSUTMXW SSKDEL SSKDSCUW SSKDSMXW

SSKDTCUW SSKDTMXW SSKINS SSKISCUW SSKISMXW SSKITCUW

SSKITMXW SSKSEL SSKSSCUW SSKSSMXW SSKSTCUW SSKSTMXW

UPDTCNT UPDTSCUW UPDTSMXW UPDTTCUW UPDTTMXW WRITCNT

WRITSCUW WRITSMXW WRITTCUW WRITTMXW

-Type 115 Subtype 2, new QEST Coupling Facility statistics

segment, MXG creates new MQMCFMGR dataset, one obs for

each structure (if QESTSTR structure name is non-blank:

IBM writes an array of 64 possible structures but MXG

outputs only the entries with data). MXG also calculates

the average duration of IXLLSTE and IXLLSTM calls in new

new variables QESTAVGE and QESTAVBM.

Updates to elements in the CF can be made one at a

time with IXLLSTE, or requests to update multiple

elements, a group of changes that have to be made

together, are done with IXLLSTM.

The other IBM variables created in MQMCFMGR dataset:

QESTCMEC QESTCSEC QESTMLUS QESTMNUS QESTMSTC QESTRMEC

QESTRSEC QESTSFUL QESTSSTC QESTSTR QESTSTRN

-Type 116: FORMAT MG116TY updated for '7:RRS BATCH' type

of attachment type.

-Type 116 subtype 0 creates old MQMACCT Message Manager

accounting; this was the only data set created from SMF

116 record prior to Version 5.2.

-Type 116 subtype 1 creates new MQMACCTQ Queue Level

Accounting dataset with WTIDxxxx and WTASxxxx variables.

This is the important, task-level, dataset, with elapsed

and CPU times per verb for commit and back out requests,

and has task identification, including Job, User ID,

Transaction Name if applicable, and Channel Name (TCP/IP

address or APPC LU).

-Type 116 subtype 1 or subtype 2 creates new MQMQUEUE

Queue Detail with WTIDxxxx and WQxxxx variables. This

data set has an observation for each QUEUE used by the

task, including number/elapsed/CPU times for MQOPEN,

MQCLOSE,MQPUT,MQPUT1,MQGET,MQINP and MQSET calls, and

the WTIDxxxx task identifiers.


Change 18.292 Cosmetic. Comment corrected and labels for Mount Wait

ASUMTMNT bucket variables MNTBKTn changed from 'PCT JOBS' to

Dec 6, 2000 the more accurate 'PCT MOUNTS*MOUNT WAIT*LESS THAN....'.

Thanks to Chuck Hopf, MBNA, USA.


Change 18.291 Cosmetic. Labels added for DOMTRESP/DOMTWAIT/DOMTRTYP/

VMAC103 DOMTRNUM variables in VMAC108, and dataset labels in the

VMAC108 VMAC103 are now "HTTP Web Sphere Server" instead of the

Dec 6, 2000 Lotus Domino no-longer-used name.

Thanks to Bruce Widlund, Merrill Consultants, USA.
Change 18.290 TMON for MVS 2.0 NQ records were not correct; Landmark

VMACTMV2 inserted data between 1.3 and 2.0, but no one noticed!

Dec 5, 2000 Both record formats are now supported, and new variables

are now created in dataset TMONNQ.

Thanks to Lindsay Robertson, GMAC Insurance, USA.
Change 18.289 Using IMACJBCK exit for DB2ACCT selection saves CPU time!

IMACJBCK The IMACJBCK exit (or MACJBCK= macro) is invoked in every

VMACDB2H SMF record that contains JOB name. For the DB2 SMF 101

Dec 5, 2000 Account records, using it instead of the EXDB2ACC/ACB/ACP

exit member to delete unwanted records can save lots of

CPU time, because it is invoked earlier in the processing

code, after the QWHS (Standard) and QWHC (Correlation)

Headers have been input, and before INPUTing all of the

other variables in all of the segments in the rest of the

accounting record, and then invoking the EXDB2ACx exit.


These QWHSxxxx and QWHCxxxx variables exist when IMACJBCK

exit is taken, and can be used to delete SMF 101 records

early, fully decoding only the selected records and then

taking EXDB2ACx exit before output into DB2ACCT/ACCTB/P:

SMFTIME ='TIME WHEN*SMF RECORD*WAS WRITTEN'

QWHSSTCK='STORE CLOCK*VALUE FOR*HEADER'

QWHSSSID='SUBSYSTEM NAME'

QWHCAID ='AUTHORIZATION ID '

QWHCCV ='CORRELATION ID '

QWHCCN ='CONNECTION NAME '

QWHCPLAN='PLAN NAME '

QWHCOPID='ORIGINAL OPERATOR ID'

QWHSRELN='RELEASE INDICATOR'

JOB ='JOB NAME*OR*TSO USER'

QWHSLUNM='LUNAME'

NETSNAME='ORIGINATING*SYSTEM*NET-NAME'

QWHCEUTX='END USERS*TRANSACTION*NAME'

QWHCEUID='END USERS*USERID*AT WORKSTATION'

QWHCEUWN='END USERS*WORKSTATION*NAME'

QWHCATYP='CONNECTING*SYSTEM TYPE*CODE'

Numeric values and their meaning:

0='0:UTILITY'

1='1:TSO'

2='2:DB2 CALL ATTACH'

3='3:DL/I BATCH'

4='4:CICS ATTACH'

5='5:IMS ATTACH BMP'

6='6:IMS ATTACH MPP'

7='7:DISTRIBUTED UOW'

8='8:REMOTE UOW'

9='9:IMS CONTROL REGION'

0AX='AX:IMS TRANSACTION BMP'

0BX='BX:UTILITY JOBS'

In your logic in IMACJBCK, you must DELETE unwanted SMF

records, so you must use NOT logic to select wanted:

//SYSIN DD *

%LET MACJBCK= %QUOTE(

IF ID=101 THEN DO;

IF QWHSSIID NE 'DB2SYS1' THEN DELETE;

IF NOT (JOB='MINE' AND QWHCPLAN='PLAN1') THEN DELETE;

END;

);

%ANALDB2R(PDB=SMF);


This change is minor: it moved the %INCLUDE of IMACJBCK

in member VMACDB2H to the end of the Correlation Header,

so all QWHCxxxx variables exist when at IMACJBCK. Added

are QWHCATYP/NETSNAME and new-in-6.1 QWHCEUID/EUTX/EUWN.

(There was no change to IMACJBCK; it just listed here so

you'll find this change when searching for that string!).


Savings: Reading 4.3GB of SMF 101 records to create all

these obs on an SU_SEC=2700 engine took 1426 CPU seconds.

Data Set Observations MegaBytes

DB2ACCT 1,842,166 1500

DB2ACCTG 1,289,146 800

DB2ACCTB 3,915,350 1430

DB2ACCTP 2,700,571 920

Total Output 4650


Deleting all obs in the _EDB2ACx exit took 1257 secs. The

delta of 1426-1257 = 169 seconds is the CPU cost for SAS

write out the 4.5 GB of output, about 27 MB/CPU second.
Using MACJBCK to delete all obs took 318 CPU seconds, so

the delta of 1257-318 = 939 seconds (deleting in _E exit)

is the CPU cost for SAS to execute the INPUT statements

for the 4.3 GB of SMF or about 4.6MB/CPU second.


The 318 seconds is the CPU cost just to read in all 4.3GB

of SMF, because the Headers are actually at the physical

end of each SMF record, so SAS reads SMF records at about

13.8 MB/CPU second.


Case Study:

Read 4.3GB Execute Write 4.5GB

SMF Data Input SAS Output Total
Output all: 318 secs 939 secs 169 secs 1426 secs

Output half:

_EDB1ACx 318 939 85 1342

IMACJBCK 318 470 85 873


Using IMACJBCK to select half of the obs saves 470 secs.
With this much possible saving, we will enhance ANALDB2R

in the near future so that any selection we can do in the

IMACJBCK exit will be done there if you use PDB=SMF for

your DB2PM-like reports, but you can exploit this exit

right now using the above example.

Thanks to Ron Alterman, Charles Schwab & Co., Inc, USA.


Change 18.288 The JCL in the TESTOTHR step of JCLTEST8 did not have the

JCLTEST8 //TMDCIN DD DUMMY and //TMDVTIN // DD DUMMY statements.

Dec 4, 2000 Member TESTOTHR had been updated to test the new support

and JCLTEST6 was updated, but JCLTEST8 was overlooked.

Thanks to Peter Herden, TUI (Touristik Union) Hannover, GERMANY
Change 18.287 Assembly error IEC293I FIRST DCB IN CLOSE NOT ACCESSIBLE

ASMIMSL6 because CLOSE (R3) must be CLOSE ((R3)) in line 1333.

Dec 1, 2000 Many MXG users have seen this error when they assembled

that program, but being ASM experts, they fixed it and

never told me about it! Since R3 is an address in reg 3

the parens tell the ASM that R3 is not a ddname!

Thanks to Alan Green, Zurich Financial Services, ENGLAND.

Thanks to Trevor Ede, EDS, NEW ZEALAND.


Change 18.286 The four new duration variables for initiator delays:

VMAC30 SMF30JQT /*JOB*PREPARATION*TIME*/

Nov 30, 2000 SMF30RQT /*INELIGIBLE*FOR*EXECUTION*TIME*/

SMF30HQT /*JOB*HOLD*TIME*/

SMF30SQT /*ELIGIBLE*FOR*EXECUTION*TIME*/

were multiplied by 1.024, but should have been multiplied

by 1024, as they are in 1024-microsecond units.

May 22, 2004: APAR OA07041 corrected SMF30SQT.

Thanks to Steve Simon, ALLTEL, USA.
Change 18.285 Cosmetic. Label for QWACARNG was corrected to be

VMACDB2 QWACARNG='WAITS FOR*SEND MSGS*DATA SHARING'.

Nov 30, 2000

Thanks to Allan J. Winston, MBNA, USA.


Change 18.284 JES 3 only. The WEEKBLD/WEEKBLDT/MONTHBLD members all

WEEKBL3 referenced dataset NJEPURGE which is JES2 only. These

WEEKBL3T three members can be used for JES3 sites; the only change

MONTHBL3 is that DJEPURGE instead of NJEPURGE is processed, and

Nov 29, 2000 the TYPE25 (also JES3-only) processing is added.

Thanks to Robert Sample, Atlanta Journal-Constitution, USA.


Change 18.283 IMS 6.1 only; variable MSGSZOUT is a constant and wrong

TYPEIMSB value in IMSTRAN dataset; the PUT "SUBQ6 $EBCDIC12." was

Nov 29, 2000 corrected to "SUBQ6 $EBCDIC4." to prevent the overlay.

My apologies to Pete Gain who's correct fix I typoed!

Thanks to Alan Green, Zurich Financial Services, ENGLAND.
Change 18.282 Invalid length ILKA record subtype 20 is protected now,

VMACILKA but the record is still invalid. The length of data in

Nov 29, 2000 SMFACDLN is 11,640, but the record is only 4092 bytes,

and the number of subpools expected is 256, but there is

room only for the first 98 subpool segments. This change

detects the bad record, prints a message on the log, and

outputs only the found subpool segments, while awaiting

a correction from the vendor. Only ILKAST20 dataset is

affected by this error.

Thanks to Frank d'Hoine, Nationale Bank van Belgie, BELGIUM


Change 18.281 Three logic errors in VMXGUOW were corrected:

VMXGUOW -IRESPTM was being summed from all MRO transactions, due

Nov 24, 2000 to the mis-location of the code that sets IRESPTM to the

single internal response time of the "TOR" transaction

(i.e.: now, IRESPTM is the response of the transaction

used for TRANNAME and TERMID).

-Counters were being summed as: HOLDX=HOLDX+X; but that

results in a missing value in the PDB.ASUMUOW output data

set if any counter was missing for any observation in the

input. Instead, the more robust HOLDX=SUM(HOLDX,X);

statement is used in VMXGUOW, so that only if all values

of a variable is missing in all input observations will

that variable have missing value in PDB.ASUMUOW output.

-The INCODE= segments (intended to allow tailoring things

like normalize CPU times across different processors, or

to add new variables) was mis-located after the code that

added the new variables, so new variables were missing.

Thanks to Chuck Hopf, MBNA, USA.


Change 18.280 Cosmetic, only affected MXG processing under ASCII SAS.

VMAC110 The variables RTYPE and RRTYPE should have been INPUT as

Nov 24, 2000 $EBCDIC1. instead of $CHAR1., so that they were converted

into ASCII characters for printing and MG110RT format.


Yüklə 28,67 Mb.

Dostları ilə paylaş:
1   ...   230   231   232   233   234   235   236   237   ...   383




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin