fig1 is a block diagram that schematically illustrates a storage area network ( san ) 20 with a performance analyzer 40 , in accordance with an embodiment of the present invention . the san is optimized for carrying only i / o traffic between storage servers 26 and storage devices 34 , and possibly among the storage devices themselves . application traffic to and from clients 22 is carried by a separate messaging network 24 , such as a local area network ( lan ) or wide area network ( wan ). typically , storage servers 26 communicate with storage devices 34 in san 20 via one or more switches 28 , which are commonly arranged as a switching fabric 30 . access to storage devices 34 is carried out through disk controllers 32 , such as the ibm sharks controller . the storage devices themselves may comprise substantially any type ( or multiple types ) of storage media , such as magnetic disks or tape or optical media . for the sake of simplicity in the present example , the storage devices are assumed to comprise disks 38 in a raid ( redundant array of independent disks ) configuration , with a raid controller 36 connected to each disk array . the connections between the elements of san 20 may be made via any suitable type of communication media and protocols known in the art , though fibre channel technology is most commonly used in currently - available high - performance sans . although for the sake of simplicity , san 20 is shown in fig1 as including only a small number of nodes , large sans may include thousands of different interrelated logical and physical entities . furthermore , although the types of physical entities that are illustrated in fig1 and the overall configuration of these entities are characteristic of many sans that are currently in use , these features of san 20 are shown only by way of illustration . the principles of the present invention are applicable ( and in fact , are most advantageous ) in sans of larger size , as well as in i / o networks of other types , and are not limited in application to any particular choice of network components or configuration . when an application performance problem is detected and reported either by an application user ( such as one of clients 22 ) or by automatic monitoring , the problem is reported to performance analyzer 40 . the performance analyzer uses network configuration information and performance metrics , as described in detail hereinbelow , to identify entities in the san that are likely to be the root cause of the specific performance problem in question . these entities are referred to hereinbelow as “ problematic entities ” or “ problematic nodes .” typically , performance analyzer 40 comprises a general - purpose computer , which is programmed in software to carry out the functions described hereinbelow . the software for this purpose may be downloaded to the computer in electronic form , over a network , for example , or it may alternatively be provided on tangible media , such as magnetic , optical or electronic storage media . the computer has suitable interfaces for communicating with san 20 to receive the network configuration and performance information necessary to carry out the functions of performance analyzer 40 . although the performance analyzer is shown in fig1 as a standalone unit , which is coupled directly to fabric 30 , the performance analyzer may alternatively be coupled to san 20 at a different point , and its functions may also be integrated into another , existing computer , such as one of servers 26 or a management station ( not shown ). fig2 is a block diagram that schematically shows details of performance analyzer 40 and of the interaction of the performance analyzer with elements of san 20 , in accordance with an embodiment of the present invention . to collect data regarding the performance of san 20 , analyzer 40 uses monitoring agents 42 that are associated with the entities in the san . agents 42 are typically implemented as software components , which run on servers 26 , switches 28 , disk controllers 32 , etc . the agents periodically measure the performance of the entities with which they are associated and report the results to an operational performance database 44 , which is stored in a suitable memory . although the collection of performance metrics is commonly carried out by software agents , other collection methods may also be used and are considered to be within the scope of the present invention . agents 42 typically report on the performance of their corresponding network entities in terms of performance metrics , which reflect the operational variables of the corresponding entities . typical performance metrics in a san include queue length , response time , throughput , capacity and utilization , inter alia . problematic behavior of an entity in the san is reflected by deviant values of one or more of the performance metrics , e . g ., values that fall outside predefined bounds ( also referred to as thresholds ) of normal behavior . these bounds are typically set heuristically , either by the system administrator or by automated statistical analysis of network performance under normal operating conditions . in embodiments of the present invention , any suitable performance bounds may be used for this purpose . the bounds may be fixed , or they may alternatively be updated dynamically during operation of san 20 . database 44 also serves as a repository of configuration information regarding the physical and logical connections between the elements of san 20 . this information may be input manually , or it may be determined by automatic management tools , such as the above - mentioned ibm totalstorage productivity center for fabric . ( further information regarding this product is available at www - 306 . ibm . com / software / tivoli / products / totalstorage - fabric /.) an ipass server 46 analyzes the data in database 44 in order to identify the problematic entities in san 20 that are likely to be the root cause of performance problems reported in the san . server 46 uses an i / o path affine san search ( ipass ) to locate these problematic entities , as described in detail hereinbelow . the search may be initiated automatically or by a system administrator , via a user interface on a user terminal 48 . fig2 shows one possible functional realization of server 46 , which combines the ipass root cause search functions with automated san management activities . the blocks in this model typically correspond to software functions performed by the server . the system administrator inputs a problem source indication 50 . the problem source is typically at the level of a storage consumer , such as a report by one or more of clients 22 that a response time of an i / o request is too long on a given logical volume of storage server 26 , or that throughput via the logical volume is too slow . alternatively , the problem source indication may be generated automatically when server 46 detects a pattern of performance faults in the performance metrics reported by agents 42 . in response to the problem source indication , server 46 invokes ipass activation 52 and data collection activation 54 . data collection may be activated on all the nodes of system 20 , or only on a selected subset of the nodes . alternatively , data collection may be operational at all times or may operate periodically , independently of any problem source indication . similarly , ipass activation 52 may be invoked even in the absence of a problem source indication to enable preemptive examination of consumer nodes and i / o paths in order to identify potential problems . in response to activation 54 , a data loader 56 loads topology and performance data from database 44 . the topology data is used by a san model generator 58 to build a graph representing the topology of san 20 . this graph may be periodically updated and stored in database 44 for subsequent use . further aspects of this graph are described hereinbelow with reference to fig3 . an i / o path builder 60 traces i / o paths through the topology from the storage consumer to the storage providers that serve this consumer . an ipass searcher 62 identifies the problematic entities along these paths . a root cause notification 64 reports the results of the search to the system administrator at terminal 48 . the system administrator may then use the results in fixing the problem or , alternatively or additionally , may instruct server 46 to expand the search to other paths . the functions of the path builder and ipass searcher are described in detail below with reference to fig4 . fig3 is a graph that schematically represents the topology of a san and i / o paths through the topology , in accordance with an embodiment of the present invention . the san model creates a pool of storage that can be shared by multiple consumers . this pool comprises logical units ( lus ) 80 , which use disk controllers 32 , wherein each lu corresponds to physical blocks on one or more physical devices ( pd ) 82 , such as disks 38 . thus , in the present embodiment , pds 82 are referred to as the “ providers ” of the storage resources in san 20 . the storage pool provided by san 20 is presented to clients 22 as a set of logical volumes ( lv ) 70 on storage servers 26 , which are also referred to as “ hosts ” ( the storage servers are san hosts ). for the purposes of this embodiment , lvs 70 are the “ consumers ” of the storage resources in the san . ( since clients 22 are located outside the san , and their contact with the san is at the application level , these clients are not considered as consumers in the context of the present model . alternatively , the model may be expanded to reach these clients . the nodes between the providers and consumers are referred to as “ mediators .” potentially , any consumer of storage resources can be configured to access any lu by setting up mappings 86 between the lvs of the consumer hosts and the appropriate lus of the providers . the mappings may include multiple levels of indirection and are typically administered using system and component configuration management tools . the mappings that are required for performance analysis are stored in the form of mapping tables , typically in database 44 , or in operating system files . these mappings are used by ipass server 46 in constructing the graph that represents the san configuration and the i / o paths within the graph . model generator 58 ( fig2 ) models san 20 as a graph sg =( v ; e ), wherein v is the set of nodes , and e is the set of edges 84 . each regular ( atomic ) node in the graph refers to either a physical ( hardware ) or a logical ( software ) atomic entity . the physical entities in the graph include , for example , a host bus adapter ( hba ) 74 , switch ports 76 , bus adapters ( ba ) 78 of disk controllers 32 , and physical devices 82 . logical entities in the graph include entities such as logical volumes 70 , logical units 80 and virtual disks 72 . to view and operate on the graph with coarser granularity , the regular ( atomic ) nodes may be grouped together into super - nodes . each super - node comprises a collection of other nodes and edges . each switch 28 , for instance , may be viewed as a super - node comprising the collection of its ports 76 . the super - nodes serve to organize the regular nodes sharing the same properties ( and the edges connecting these nodes ) into a single logical entity . this use of super - nodes allows for coarser granularity of presentation and explicit modeling of relationships among the entities , without regard to the internal structure of the super - node . it also helps to speed up the navigation of the san graph . each edge in the graph sg represents a link connecting a pair of nodes or super - nodes . the link may represent a physical connection ( such as a communication link ) or a logical relationship ( such as an address mapping ) between the nodes . the address mappings recorded in the mapping tables in database 44 , for example , are represented by the logical links between the nodes in the san graph . in contrast to the physical links , the logical links may connect nodes that are not directly connected in the physical topology of the san . logical links are represented in the graph by directed edges . for example , the logical link between lv 1 of host 1 and lu 1 of the disk controller labeled disk 1 in fig3 represents address mapping 86 between the storage consumer and the provider . the san logical topology usually imposes restrictions on graph sg , such as limitations on node access , in addition to the basic restrictions of the physical topology . for example , a raid array may be physically connected to a switch that facilitates direct connections to multiple file servers . the raid array itself , however , can typically be accessed by these servers through the logical volume manager ( lvm ) on a host , and not directly . san model generator 58 therefore prunes the san graph to eliminate edges that correspond to physical connections that are prohibited by the logical topology . this pruning simplifies the tracing of i / o paths by path builder 60 . as another example , zoning is often used in sans to provide protection and security for different applications . zones partition the san into logical subnets that allow grouping of devices that can communicate and share information . address mappings between consumers and providers of storage resources are typically allowed only between san entities belonging to the same zone . model generator 58 uses zoning information in constructing the san graph , such that path builder 60 will trace paths only within the zone to which the consumer in question belongs . each node in graph sg has a vector r of attributes representing the resources of the node . for example , the resources of a disk controller typically include its storage capacity and its bandwidth , inter alia . with respect to each resource in r , the corresponding entity in the san may act as either a consumer , a provider or a mediator of that resource . each resource has one or more associated performance metrics , which have values that can be measured directly by agents 42 based on the operation of the physical or logical entity to which the metric belongs . as noted earlier , exemplary performance metrics include queue length , throughput , capacity and utilization . problematic nodes are characterized by one or more metrics that fall outside the predetermined bounds of normal operation . fig4 is a flow chart that schematically illustrates a method performed by ipass server 46 to diagnose performance problems in san 20 , in accordance with an embodiment of the present invention . the method is typically initiated when a consumer c ( for example , lv 1 of host 1 in the graph of fig3 ) reports a performance problem , at a problem reporting step 90 . in response to this report — either received automatically or following a command entered via terminal 48 — ipass server 46 carries out an i / o path affine search through the san in order to identify problematic nodes on i / o paths that terminate on node c . in the course of this search , path builder 60 constructs each of the candidate i / o paths , at a path construction step 92 . the paths taken together have the form of a directed acyclic graph ( dag ) within the overall san graph , emanating from a root at c to all the provider nodes p that serve c . for example , edges 84 that are marked in fig3 show the dag emanating from lv 1 of host 1 to providers pd 1 of disk 1 and pd 1 of disk 2 . other edges in the graph , such as a link 87 from port 1 of switch 2 to hba 1 of host 2 , are eliminated from the dag , since server 46 recognizes that these edges are not logically connected to c by a mapping in san 20 . path builder 60 typically matches physical links in the san configuration data with logical connections in the mapping tables by using the unique device ids that are assigned to all the entities in the san and identify the devices in both the configuration data and mapping tables . searcher 62 evaluates the performance metrics of the nodes along the paths in the dag in order to identify the set of problematic nodes , pn , at a node finding step 94 . although steps 92 and 94 are listed sequentially in fig4 , in practice these steps may be carried out in parallel . in other words , server 46 evaluates each new node that it adds to the dag to determine whether the node is problematic . this procedure typically continues until the entire dag has been constructed , and the performance metrics of all the nodes along the dag have been evaluated . alternatively , the search may terminate after a preset number of problematic nodes have been found , even if the dag is not complete . optionally , server 46 computes a severity level for each problematic node identified at step 94 , and may then sort and display the list of problematic nodes in order of severity . typically , the severity level reflects the number of performance metrics at the node that are outside the preset bounds and the amount by which the metrics deviate from the bounds . for example , the severity level for any given node may be computed as a weighted sum of the percentage of deviation of all the relevant performance metrics at that node . weighting may be based on history , for example , such that more recent data gets a weight larger than the weight of older data . table i below lists the method of steps 92 and 94 in pseudocode form , using an object - oriented style . the program in table i assumes implicitly that all nodes that can be reached in the search belong to the same zone as c in the san . the scheme uses an informed depth - first search ( dfs ) with four colors : white , blue , gray and black . the method shown in the table constructs i / o paths that are , in fact , a sub - graph of the san graph . these paths form a collection of point - to - multipoint paths between consumers and providers of the storage resources . in the pseudocode , the point - to - multipoint paths are referred to as objects that have member functions and member variables . initially , all the nodes in the san graph are marked “ white .” when the search visits a given node , it marks the node “ gray .” when the branch of the search that is currently being explored encounters another gray node or a blue node , it is a sign that the branch has made a cycle . the cycle may belong to the path that will result from the search , but initially there is no way to determine unequivocally whether this is the case . therefore , upon encountering a gray or blue node , the dfs backtracks . if all neighbors of a gray node have been explored , the color of the node changes to blue during the backtracking . thus , a blue node indicates that the branch rooted at this node is fully explored , but its final status is still uncertain . a node is colored black when the dfs determines that the node belongs to an explored branch that terminates at the resource provider according to the mappings . path construction step 92 terminates when all mappings are recursively explored . paintblackupstream ( node n ) traverses and paints the point - to - multipoint objects starting from the node referred to by the argument and terminating at the root of the path . it paints black all the nodes it traverses . addentity ( entity e ) adds an entity ( link or node ) into the point - to - multipoint path object . removeentity ( entity e ) is the opposite of function addentity ( entity e ). removebranch ( entity e ) removes all entities in the path , starting from the entity referred by the argument . findproblematicentitiesonpath ( paths pt ) takes as an argument a paths object , and returns the subset of entities which violate thresholds on this path . since the implementation of these functions is intuitive , their specific implementation is not given in the pseudocode below . table i i / o path construction sangraph : a class representing the san ( topology + mappings ). paths : a class representing a collection of point to multipoint i / o paths 1 . sangraph sg : initially , the color of each node in sg is white 2 . p ø : auxiliary set of nodes used for path construction 3 . n : the maximal number of problematic nodes to search for 4 . pn ø : the set of problematic nodes found in stage 1 5 . paths dag ø : i / o paths that are constructed by the algorithm in stage 1 ipass1 ( entrypoints , giventargets ) { 6 . p { entrypoints }; 7 . do { 8 . cur removefirst ( p ) // gets first element in the internal order of p and removes it from the set 9 . if ( giventargets == ø ) 10 targets sg . getmappingsfrom ( cur ). gettargets ( ); 11 else 12 . targets giventargets 13 . paths buildiopaths ( cur , targets ) 14 . dag dag ∪ { paths } 15 . if ( paths . isnotempty ( )) p path . getleaves ( ) 16 . } while p ≠ ø 17 . pn findproblematicentitiesonpath ( dag ) 18 . return pn } paths buildiopaths ( cur , targets ) { 19 . foreach target ∈ targets do { 20 . allocate new paths object pt 21 . pt pt . recursivepath ( cur , target , null ) // null signifies that the current entity has no previous node or link in the paths object pt 22 . if ( pt . status == affirmative ) 23 . return pt 24 . } // end foreach 25 . return empty paths } // affirmative : signifies that a target was found // negative : signifies that a target was not found in the current branch // uncertain : signifies that the status of the current branch is not yet known paths recursivepath ( start , dest , prev ) { 26 . this . status negative ; 27 . if ( start . type == node ) { 28 . switch ( start . color ) { 29 . case white : 30 . start . color gray 31 . break ; 32 . case blue : 33 . case gray : 34 . this . status uncertain 35 . return pt 36 . case black : 37 . this . status affirmative 38 . return this 39 . } 40 . } // end if ( start . type == node ) 41 . this . addentity ( start , prev ) // adds start after prev in the pt object 42 . outlinks sg . computeoutlinks ( start ) // gets all physical links of start ( except prev , if it &# 39 ; s a link ) 43 . foreach link ∈ outlinks do { 44 . if ( link . to == dest or link . from == dest ) { 45 . addentity ( link , start ) 46 . addentity ( dest , link ) 47 . this . paintblackupstream ( dest ) // paint black all entities on paths leading to dest 48 . this . status affirmative 49 . return this 50 . } 51 . peer link . to 52 . this . addentity ( link , start ); 53 . if ( peer ∉ this ) { 54 . use path pruning heuristics to eliminate the search directions which are not promising . see table ii for an example of such heuristics . 55 . else { 56 . this this . recursivepath ( peer , dest , link ) 57 . if ( this . status == negative ) 58 . this . removebranch ( link ) 59 . else if ( this . status == affirmative ) 60 . peer . color black 61 . 62 . }// if ( peer ∉ this ) 63 . else if ( peer . color == black ) 64 . this . status affirmative 65 . }// foreach 66 . if ( start . color == gray ) if ( this . status == negative or this . status == uncertain ) 67 . start . color blue 68 . 69 . return this } computeoutlinks ( node nd ) { 70 . resultlist ø 71 . foreach neighbor n of nd in sg do 72 . if a physical link l =( nd , n ) exists 73 . resultlist . add ( l ) 74 . mappings nd . getmappings ( ) 75 . 76 . resultlist resultlist ∩ mappings 77 . return resultlist } table ii below gives an example of a heuristic method that may be used to prune unnecessary search directions at step 92 . in common san topologies , some entities may have dual roles . for example , a logical device at a host acts as a consumer of storage from the disk controllers and also as a mediator between the application consuming the storage and the disk controller that provides it . some paths may therefore be irrelevant for san management , such as paths that connect consumers to consumers or providers to providers . therefore , the ipass path builder may use heuristics , such as those shown in table ii , to exclude these irrelevant branches . table ii example of path pruning heuristics variables peer , start , pt , and link are same as in recursivepath (. ), table i . 1 . if ( peer . isconsumer ( ) and ! peer . ismediator ( ) and ! peer . isprovider ( ) or ( peer . isprovi der ( ) and start . isprovi der ( ))) 2 . pt . removeentity ( link )// this direction is not promising returning now to fig4 , at the conclusion of step 94 , server 46 outputs the set of problematic nodes on the dag to the system administrator via terminal 48 . the system administrator reviews these results , at a review step 96 . alternatively or additionally , the results may be analyzed by an automated analysis tool . if the system administrator ( or automated tool ) determines that one of the problematic nodes appears to be the root cause of the performance problem reported by the consumer , appropriate corrective action may be initiated , at a problem corrections step 98 . typically , the corrective action comprises replacing or reconfiguring the problematic entity in san 20 . alternatively , the system administrator ( or automated tool ) may determine that none of the problematic nodes reported at step 94 is itself the root cause of the performance problem at hand . in this case , the search may be expanded , at a crossing path checking step 100 . at this step , server 46 checks other i / o paths in san 20 that cross the paths in the dag found at step 92 . typically , the server checks the paths that cross the original dag at nodes that were previously identified as problematic . thus , for example , if ba 1 of disk 2 was identified as a problematic node on a path from lv 1 of host 1 to lu 2 of disk 2 at step 94 , server 46 may check the crossing path from host 2 via ba 1 of disk 2 to lu 1 of disk 2 at step 100 . the rationale for checking the crossing path is that problems originating on the crossing path are likely to affect the performance of the node at which the paths cross . thus , in the present example , if an application served by host 2 is creating an excessive load on lu 1 , the performance of ba 1 may suffer as a result , so that throughput to and from lu 2 is compromised . server 46 finds and reports the problematic nodes located on the crossing paths , at a crossing path reporting step 102 . as in the first stage of the search , steps 100 and 102 are typically carried out simultaneously . table iii is a pseudocode listing of the method of steps 100 and 102 . the method begins from the set of problematic nodes found at step 94 , which are now labeled pn 1 , and searches the crossing paths to find additional problematic nodes pn 2 . the same simplifying assumptions are used here as in the listing in table i . table iii crossing path construction ipass2 ( san topology , problematic nodes ) { 1 . // variables of stage 1 are available for use in // stage 2 2 . sg san topology 3 . pn1 problematic nodes : the set of problematic nodes found at stage 1 ( ipass1 (.)) 4 . pn2 ø : the set of problematic nodes found at stage 2 5 . consumers : all consumer nodes in the zone 6 . 7 . foreach c ∈ consumers do { 8 . paths buildiopaths ( c , pn1 ) 9 . pn2 pn2 ∪ findproblematicentitiesonpath ( paths ) 10 . targets c . getmappings ( ). gettargets ( ) 11 . midpoints paths . getleaves ( ) 12 . pn2 pn2 ∪ ipass1 ( midpoints , targets ) 13 . }// end foreach 14 . return pn2 } certain changes may be made in the simplified code of table iii in order to make this stage run more efficiently . for example , for the sake of efficiency , the search may start at the problematic nodes that had the highest severity level and may be limited to traversing no more than a preset number of crossing paths . the method may also be modified to identify and eliminate crossing paths that overlap one another . additionally or alternatively , before searching for problematic nodes on the crossing paths , server 46 may first check the nodes that are immediate neighbors of the problematic nodes identified at step 94 , or all the nodes that are within a certain distance of the problematic nodes . the server goes on to build the complete crossing paths only if none of these neighbors is found to be the root cause of the performance problem . the selection of neighboring nodes to check may be further refined based on a priori knowledge of dependencies of the problematic nodes on other nodes in the san . for instance , it might be found ( based on history listings ) that whenever disk controller 1 has a long request queue , so does disk controller 2 . this fact may be used in node selection even if the reasons for the dependency are unknown . one source of knowledge about dependencies may be previous runs through the method of fig4 , in which it was discovered that a problem at one node was caused by the behavior of a certain other node . another source of knowledge might be the physical proximity of certain nodes , so that heat produced by one node affects the other . as another option , in small sans it might be feasible and desirable , to compute dags of i / o paths in advance . in large sans , precomputing all dags may be infeasible . if , however , there are parts of the san in which i / o traffic is heavier , and the risk of performance problems is higher , it might be useful to compute a small subset of dags relevant to that part of the san in order to avoid recomputation . although the exemplary embodiments described above relate to a specific sort of san configuration , the methods used in these embodiments may be applied , as well , to storage networks having other configurations , such as a san in which hosts access storage resources directly . furthermore , the principles of the present invention are applicable , mutatis mutandis , to finding the root cause of problems in other network - based systems , such as server farms used as application servers and multi - processor computing systems . it will thus be appreciated that the embodiments described above are cited by way of example , and that the present invention is not limited to what has been particularly shown and described hereinabove . rather , the scope of the present invention includes both combinations and subcombinations of the various features described hereinabove , as well as variations and modifications thereof which would occur to persons skilled in the art upon reading the foregoing description and which are not disclosed in the prior art .